throw
このステートメント (より複雑なコードから抽出されたもの) がコンパイルされることに偶然気付きました。
void foo() {
try {
} catch (Throwable t) {
throw t;
}
}
短いながらも幸せな瞬間、私はチェック例外が最終的にすでに死ぬことを決定したと思っていましたが、それでもこれには満足しています:
void foo() {
try {
} catch (Throwable t) {
Throwable t1 = t;
throw t1;
}
}
ブロックは空である必要はtry
ありません。そのコードがチェックされた例外をスローしない限り、コードを持つことができるようです。それは理にかなっているように思えますが、私の質問は、言語仕様のどの規則でこの動作が説明されているのでしょうか? 私が見る限り、§14.18 throw ステートメントは明示的に禁止しています。これは、式の型がt
チェック済み例外であり、キャッチされていないか、スローされるように宣言されていないためです。(?)