AI作成・独立検証済(有資格者監修なし)1Z0-815 対応
ラッパークラス(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  }
  1. A5行目で NumberFormatException がスローされ、"123 123" は出力されない
  2. B123 123"12.3" は小数点以下を切り捨てて整数変換される)
  3. Cコンパイルエラー(Integer.parseInt("12.3") は文字列の内容次第でコンパイルエラーになる)
  4. D123 123 と正常に出力された後、プログラムがハングする
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Integer.parseInt(String)Integer.valueOf(String) はどちらも文字列を数値に変換するが、戻り値の型が異なる

  • Integer.parseInt(String):戻り値はプリミティブ int
  • Integer.valueOf(String):戻り値はInteger(ラッパー・オブジェクト)。

3・4行目はどちらも "123"(正しい整数形式)なので問題なく変換される(a=123b=Integer型の123)。

しかし5行目 Integer.parseInt("12.3") は、小数点を含む文字列は整数として解釈できないため、実行時に NumberFormatException がスローされる(これはコンパイル時ではなく、渡された文字列の内容次第で実行時に判明する)。 例外は6行目の println より前に発生するため、"123 123" は出力されない

各誤答が違う理由
  • BInteger.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が作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
この分野をもっと解いて、得点源に
データ型 を含む問題を分野別に演習できます。
演習する →