次のコードは完全にコンパイルされます。そして、コンパイラは、コンパイル時に、コントロールが finally ブロックに移動し、チェックされていない例外をスローすることを知っているためだと思います (これは問題なく、処理する必要はありません)。この時点までは失われます。心配する必要はありません。
try{
// DoSomething();
}catch(Exception e){
// Throw checked exception
}finally{
// Throw unchecked exception
}
例:
public class TestClass {
public static void main(String[] args) {
TestClass c = new TestClass();
try {
// Whatever
} catch (Exception e) {
throw new FileNotFoundException();
} finally {
throw new NullPointerException();
}
}
}
メソッドから未チェックの例外をスローするまでは、これまでのところ問題ありません。
try{
// DoSomething();
}catch(Exception e){
// Call a method that throws a checked exception
// or just throw the checked exception from here
}Finally{
// Call a method that throw an unchecked exception
}
例:
public class TestClass {
public static void main(String[] args) {
TestClass c = new TestClass();
try {
//Whatever
} catch (Exception e) {
c.m1();
// or just throw it here
// throw new FileNotFoundException();
} finally {
c.m2();
}
}
public void m1() throws IOException {
throw new FileNotFoundException();
}
public void m2() throws RuntimeException {
throw new NullPointerException();
}
}
このコードはコンパイルされません。c.m1() をエラー「未処理の例外タイプ _」(eclipse) または「報告されていない例外 _; キャッチするか、スローするように宣言する必要があります」(cmd) でマークします。
finallyブロックが LAST 例外 (チェックされていない) をスローすることを無視したようであり、catch ブロック内の例外が未処理のチェック済み例外であっても心配する必要はありません。とにかく失われるからです! m2() が特に未チェックの例外 (RuntimeException) をスローするように宣言されていることを知っている。
2 番目のコードでコンパイル エラーが発生する理由について、より詳しい説明がある人はいますか? ありがとう :)