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"を渡すと実行時に例外です。

直し方: IntegerDouble にします。

この問題を解いてみる →

パターン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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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