例外が呼び出し元に伝わる
出力はどれか。
public class Main {
static void a() {
System.out.print("a1 ");
b();
System.out.print("a2 ");
}
static void b() {
throw new RuntimeException();
}
public static void main(String[] args) {
try {
a();
} catch (RuntimeException e) {
System.out.print("main ");
}
}
}
- A
a1 main - B
a1 a2 main - C
main - D コンパイルエラーになる
正解と解説を見る
正解: A
- A: a1 を出力した後、b() の例外が a() を抜けて main まで伝わるので、a2 は出力されず main が出力されます。
- B: b() で例外が発生した時点で a() の残り (a2) は実行されません。
- C: a() は a1 を出力してから b() を呼ぶので、a1 も出力されます。
- D: RuntimeException は非チェック例外なので、throws を書かなくてもコンパイルできます。
ポイント
- 例外はその場で処理されなければ、呼び出し元へ順に伝わります。b → a → main と伝わり、main の catch で処理されます。
- 例外が起きた後の a の残り ("a2") は実行されません。
「例外処理の仕組みとチェック例外、非チェック例外、エラーの違い」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)