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() にします。
パターン4
1 public class Main { 2 public static void main(String[] args) { 3 String s = "1,000" ; ^ 4 System.out.println(Integer.parseInt(s)); 5 } 6 }
Exception in thread "main" java.lang.NumberFormatException: For input string: "1,000"exited with code 1
カンマ区切りの数字はparseIntが理解できません。カンマを取り除いてから渡します。
直し方: "1,000" を "1000" にします。
パターン5
1 public class Main { 2 public static void main(String[] args) { 3 String s = "42.0"; ^ 4 System.out.println(Integer.parseInt(s)); 5 } 6 }
Exception in thread "main" java.lang.NumberFormatException: For input string: "42.0"exited with code 1
parseIntは整数の文字列しか受け付けません。小数点が付いた時点で失敗します。
直し方: "42.0" を "42" にします。
よくある誤解
「数字に見える」文字列でも通らないことがあります。全角数字、カンマ区切り、前後の空白はすべて失敗します。
実務での勘所
Integer.parseIntは前後の空白すら許容しない厳格な仕様です(トリムは自動で行われません)。ユーザー入力を扱う実務コードでは、parseIntを直接呼ぶ前にString#trim()で空白を除去し、可能ならScannerのhasNextInt()のような判定メソッドで事前に「数値として解釈できるか」を確認してから読み取るのが定石です。例外を投げさせてからtry-catchで拾う書き方は動きますが、入力検証の意図が読み取りにくくなります。