Exception では Error を捕まえられない
このコードを実行するとどうなるか。
public class Main {
static void loop() {
loop();
}
public static void main(String[] args) {
try {
loop();
} catch (Exception e) {
System.out.println("caught");
}
}
}
- A
caughtと出力される - B 何も出力されずに正常終了する
- C エラーが発生してプログラムが止まる (例外が発生する)
- D コンパイルエラーになる
正解と解説を見る
正解: C
- A: StackOverflowError は Error の仲間で Exception ではないので、catch (Exception e) では捕まえられません。
- B: loop() は自分自身を無限に呼ぶので、正常には終わりません。
- C: 無限の再帰でスタックがあふれて StackOverflowError が発生し、catch (Exception e) では捕まらないのでプログラムが止まります。
- D: 自分自身を呼ぶメソッド (再帰) は文法上問題なく、コンパイルできます。
ポイント
- 終わらない再帰呼び出しは StackOverflowError を起こします。Error は Exception のサブクラスではないので、
catch (Exception e)では捕まえられません。 - 例外クラスの頂点は Throwable で、その下に Exception と Error があります。
「例外処理の仕組みとチェック例外、非チェック例外、エラーの違い」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)