今回は例外処理に関連した問題を解きましょう。
問題
次のプログラムを実行した場合に出力される内容はどれですか?正しい選択肢を選んでください。
public class ExceptionTest {
public static void main(String[] args) {
try {
riskyMethod();
} catch (IllegalArgumentException e) {
System.out.println("Caught IllegalArgumentException");
} catch (Exception e) {
System.out.println("Caught General Exception");
}
}
public static void riskyMethod() throws Exception {
throw new IllegalArgumentException("Invalid Argument!");
}
}
選択肢
- A. Caught IllegalArgumentException
- B. Caught General Exception
- C. 無限ループに陥る
- D. 実行時エラーになり、出力はされない
答えと解説
回答を見る
答え
A. Caught IllegalArgumentException
解説
基本説明:
Javaの例外処理は、コードがエラーを起こしたときにプログラムが安全に終了できるように使用します。例外は通常、発生したエラーを表す特別なオブジェクトです。
このコードでは、メソッドriskyMethod
がIllegalArgumentException
をスローします。main
メソッドでは、この例外をキャッチするためのtry-catch
ブロックがあります。
誤答理由:
選択肢Bの「Caught General Exception」は、IllegalArgumentException
がException
を継承しているため、キャッチできる可能性があります。ただし、IllegalArgumentException
にマッチする最初のcatch
ブロックで処理されるため、選択肢Aが適切です。
無限ループや実行時エラーになる要素はコード内にはなく、例外が適切に処理されています。
つまずきポイント:
初心者が誤解しやすいのは、catch
ブロックの優先順位です。例外はスローされた後、その例外型に一致するcatch
ブロックに到達すると、そのブロックで処理されます。
例外をスローするメソッドが明示的にthrows
キーワードで指定されている場合、それが実際にどのcatch
で捕まるかを確認するのが重要です。
発展知識:
Javaでは、例外クラスはThrowable
を基底クラスとする階層を持ちます。Exception
クラスとそのサブクラスは、チェック例外と呼ばれます。
チェック例外はコンパイル時に処理が求められるもので、RuntimeException
とそのサブクラスは非チェック例外(実行時例外)として扱われ、プログラムが実行されるまで処理は求められません。
例外設計を理解することで、適切なエラーハンドリングを書くことができます。