首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 數字與字串轉換常見錯誤與正確姿勢

     編輯:Java 相關知識

問題重現

程式碼意圖:從標準輸入讀取數字累加,輸入 0 結束。但輸入 1 2 3(空白分隔)時拋出 NumberFormatException,印出 "Invide number"。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
int i, sum = 0;
do {
    str = br.readLine();           // 讀取整行 "1 2 3"
    try {
        i = Integer.parseInt(str); // 嘗試解析 "1 2 3" → 失敗
    } catch (NumberFormatException e) {
        System.out.println("Invide number");
        i = 0;
    }
    sum += i;
    System.out.println("Current sum is: " + sum);
} while (i != 0);

根本原因

  • readLine() 讀取的是「整行文字」,包含空白。
  • Integer.parseInt() 只能解析純數字字串(可含正負號),不支援空白分隔的多個數字。

正確解法三種

方案一:Scanner 自動分詞(最簡單)

Scanner sc = new Scanner(System.in);
int sum = 0;
System.out.println("Enter numbers, 0 to Exit");
while (sc.hasNextInt()) {
    int i = sc.nextInt();
    if (i == 0) break;
    sum += i;
    System.out.println("Current sum is: " + sum);
}

方案二:BufferedReader + String.split 手動分割

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int sum = 0;
String line;
while ((line = br.readLine()) != null) {
    for (String token : line.trim().split("\\s+")) {
        try {
            int i = Integer.parseInt(token);
            if (i == 0) { System.out.println("Final sum: " + sum); return; }
            sum += i;
            System.out.println("Current sum is: " + sum);
        } catch (NumberFormatException e) {
            System.out.println("Invalid number: " + token);
        }
    }
}

方案三:Stream API(Java 8+)

new BufferedReader(new InputStreamReader(System.in)).lines()
    .flatMap(line -> Arrays.stream(line.split("\\s+")))
    .map(String::trim)
    .filter(s -> !s.isEmpty())
    .map(Integer::parseInt)
    .takeWhile(i -> i != 0)
    .forEach(i -> System.out.println("Sum: " + (sum += i)));

數字 ↔ 字串轉換速查表

方向方法範例
int → StringString.valueOf(i) / Integer.toString(i) / i + ""String s = String.valueOf(123);
String → intInteger.parseInt(s) / Integer.valueOf(s)int i = Integer.parseInt("123");
double → StringString.valueOf(d) / Double.toString(d)
String → doubleDouble.parseDouble(s) / Double.valueOf(s)
格式化輸出String.format("%,.2f", d) / DecimalFormatString.format("%,.2f", 1234.5) → "1,234.50"

常見陷阱提醒

  1. parseInt 拋出 NumberFormatException 屬非受檢異常,需 try-catch。
  2. 字串含前後空白 → trim() 後再解析。
  3. 大數值超出 int 範圍 → 改用 Long.parseLong 或 BigInteger。
  4. 區域設定影響:法文環境下 1 234,56 需用 NumberFormat.getInstance(Locale.FRANCE).parse()。

結語

「輸入 1 2 3 卻報錯」是初學者最常遇到的標準輸入處理誤區。掌握 Scanner 或 split("\\s+") 分詞技巧,並熟悉各型別轉換 API,即可輕鬆處理各類數字輸入場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved