Code Fix

中級

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で拾う書き方は動きますが、入力検証の意図が読み取りにくくなります。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)