NumberFormatExceptionについて見当もつかなかったので調べてみました。
理解を深めていきたいと思います。
NumberFormatExceptionとは
NumberFormatExceptionは文字列を数値型に変換しようとしたときに文字列が数値型に適した状態でない場合に発生します。
簡単に言えば”100″などの数値の文字列でない場合に発生します。
ちなみにNumberFormatExceptionは直訳すると数次のフォーマットの例外となります。
クラスの継承関係
━ java.lang.RuntimeException
┗ java.lang.IllegalArgumentException
┗ java.lang.NumberFormatException
クラスはjava.lang.NumberFormatExceptionはjava.lang.IllegalArgumentExceptionを継承しています。
継承関係や例外の種類などについてRuntimeExceptionについてで詳しく説明しています。
NumberFormatException サンプルコード
サンプルコードをみながらどのような時にNumberFormatExceptionが発生するかみてみましょう。
ひらがなを数値へ
String str = “あいう”;
int i = Integer.parseInt(str); // NumberFormatException
System.out.println(i);
ひらがなは数値に変換できないためNumberFormatExceptionが発生しています。
漢字を数値へ
String str = “百”;
int num = Integer.parseInt(str); // NumberFormatException
System.out.println(num);
漢字の”百”を数値へ変換することができないためNumberFormatExceptionがスローされます。
ちなみに全角の数字は数値へ変換されます。
charの値をStringに変換してから数値へ
char ch = 100; //d
String str = String.valueOf(ch);
int num = Integer.parseInt(str); //NumberFormatException
System.out.println(str);
charに数値を入れているので一見Stringに100が入っているように錯覚してしまいますが、charに100はASCIIで「d」となるので「d」が代入されています。
そのためStringにキャストした際にはdが代入され、数値に変換できないのでNumberFormatExceptionが発生します。
NumberFormatExceptionの対策
NumberFormatException発生しそうな箇所はtry-catch文で囲います。
try{
String str = “Programmer Life”;
int num = Integer.parseInt(str); //NumberFormatException
System.out.println(str);
}catch (NumberFormatException e){
System.out.println(“数値に変換できません。”);
}
try-catch文で囲うと実行時エラーは発生しなくなります。
おわり
英語にnumberとついているのでStringが原因だとすぐに気付けなくて、少し苦手な例外です。わかってしまえばたいしたことないんですけどね。Java仕事でいっさい使ってないからすぐ忘れる。
参考
https://docs.oracle.com/javase/jp/7/api/java/lang/NumberFormatException.html