JJビーム:
なぜコードがあります
void methodThrowsException() /*throws Exception*/{
try {
// throw new Exception();
} catch (Exception e) {
throw e;
}
}
うまくコンパイル?それは例外を投げたりすることができないために私の知る限りコンパイラがコードを解析しません。ここで明らかにthrow e;
(コメントのために実行されることはありません// throw new Exception();
)が、なぜコンパイラはこれを知っていますか?
GhostCat敬礼モニカC.:
javacコンパイラは、本当に多くの最適化を行いません。しかし、単純なデッドコードの検出および最適化はまだ可能です。
あなたの例では:コンパイラは、簡単にすることを検出することができますのtryブロックは空です。すべてのcatchブロックのコードは、本質的であるので、空のtryブロックは、スローすることはできません死にました。
コンパイラはそうでした完全にここに全体のtry / catchで、シンプルなドロップ行きます。そして、例外をスローする可能性が残って何もありません。
これは、私たちがてjavapを使用するときに我々は、バイトコードで見つけるまさに次のとおりです。
void methodThrowsException();
Code:
0: return
そして、はい、他の答えは完全に正しいです:これは、あなたが使用しているため、このように動作しException
、より具体的な(チェック)サブクラスは、コンパイルエラーにつながります。