ラッパークラス(Integer.parseInt vs Integer.valueOf・NumberFormatException)難易度 標準無料
次のコードの実行結果として正しいものを選べ。
1 public class Q20 {
2 public static void main(String[] args) {
3 int a = Integer.parseInt("123");
4 Integer b = Integer.valueOf("123");
5 int c = Integer.parseInt("12.3");
6 System.out.println(a + " " + b);
7 }
8 }
- A5行目で
NumberFormatExceptionがスローされ、"123 123"は出力されない - B
123 123("12.3"は小数点以下を切り捨てて整数変換される) - Cコンパイルエラー(
Integer.parseInt("12.3")は文字列の内容次第でコンパイルエラーになる) - D
123 123と正常に出力された後、プログラムがハングする
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
Integer.parseInt(String) と Integer.valueOf(String) はどちらも文字列を数値に変換するが、戻り値の型が異なる。
Integer.parseInt(String):戻り値はプリミティブint。Integer.valueOf(String):戻り値はInteger(ラッパー・オブジェクト)。
3・4行目はどちらも "123"(正しい整数形式)なので問題なく変換される(a=123、b=Integer型の123)。
しかし5行目 Integer.parseInt("12.3") は、小数点を含む文字列は整数として解釈できないため、実行時に NumberFormatException がスローされる(これはコンパイル時ではなく、渡された文字列の内容次第で実行時に判明する)。
例外は6行目の println より前に発生するため、"123 123" は出力されない。
- B
Integer.parseIntは小数点を含む文字列を「切り捨てて整数化」するのではなく、そもそも不正な整数形式として例外を投げる。5行目で処理が止まるため6行目には到達しない。 - C文字列の中身が不正かどうかは実行時にしか判定できない。コンパイラは文字列リテラルの中身を検証しないため、コンパイルは通り、実行時に例外が発生する。
- D5行目で
NumberFormatExceptionが即座にスローされてプログラムは終了する。6行目のprintln自体に到達しないため "123 123" は出力されず、ハングもしない。
ひっかけ: 「
"12.3" のような数字っぽい文字列なら parseInt でも通る」という思い込みが罠。parseInt は厳密に整数形式(先頭の符号+数字のみ)しか受け付けず、小数点を含む文字列は不正形式として NumberFormatException になる(小数を扱いたい場合は Double.parseDouble を使う)。コマンド例と想定される挙動(未実行)
実行結果:
Exception in thread "main" java.lang.NumberFormatException: For input string: "12.3"
at java.base/java.lang.Integer.parseInt(Integer.java:...)
at Q20.main(Q20.java:5)
(5行目で例外がスローされ、6行目の println には到達しない="123 123" は出力されない)公式ドキュメント・関連Integer.parseInt(String)(SE11 API)↗
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)