NumberFormatException の原因と直し方
parseIntは全体が数値でなければ失敗します。空白や記号が混ざる入力の扱い方を解説します。
エラーメッセージの読み方
Exception in thread "main" java.lang.NumberFormatException: For input string: "12a"
main- スレッド名 — mainなら起動直後の処理で発生しています
java.lang- パッケージ — java.lang なら標準の基本例外です
NumberFormatException- 例外クラス — 何が起きたか。ここを検索するのが最短です
For input string: "12a"- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 public class Main { 2 public static void main(String[] args) { 3 String s = "12a" ; ^ 4 System.out.println(Integer.parseInt(s)); 5 } 6 }
Exception in thread "main" java.lang.NumberFormatException: For input string: "12a"exited with code 1
parseIntは全体が数値でなければ例外を投げます。前後の空白も許容されません。
直し方: "12a" を "12" にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 public static void main(String[] args) { 3 String s = "3.14"; 4 System.out.println(Integer.parseDouble(s)); ^ 5 } 6 }
Main.java:4: error: cannot find symbol
symbol: method parseDouble(String)
小数を読むにはDouble.parseDoubleを使います。Integer.parseIntに"3.14"を渡すと実行時に例外です。
直し方: Integer を Double にします。
パターン3
1 public class Main { 2 public static void main(String[] args) { 3 String s = " 42 "; 4 System.out.println(Integer.parseInt(s )); ^ 5 } 6 }
Exception in thread "main" java.lang.NumberFormatException: For input string: " 42 "exited with code 1
前後の空白は数値として解釈されません。入力を扱うときはtrim()を挟むのが定石です。
直し方: (空) を .trim() にします。
よくある誤解
「数字に見える」文字列でも通らないことがあります。全角数字、カンマ区切り、前後の空白はすべて失敗します。
まとめ
NumberFormatExceptionは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。