编译时检查异常。最后一个块隐含地抛出未经检查的异常的情况

时间:2013-12-05 20:05:34

标签: java exception-handling compile-time try-catch-finally unchecked-exception

以下代码完美编译。我相信这是因为编译器在编译时知道控件将转到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()是DECLARED以专门抛出未经检查的异常(RuntimeException)。

有没有人对第二个代码中出现编译错误的原因有更好的解释? 谢谢:))

1 个答案:

答案 0 :(得分:1)

例外就是不要“抛出”自己。您必须显式处理被调用方法抛出的任何已检查异常 - 无论它们发生在何处。您调用抛出已检查异常的任何内容都必须被try catch块包围,或者调用子方法的方法必须声明抛出相同类型的异常。这不适用于已检查的例外情况。

这意味着,你有

的地方
catch (Exception e) {
     c.m1(); 
         // or just throw it here
         // throw new FileNotFoundException();
}

您必须捕获m1引发的已检查异常,因为main未声明它会抛出任何内容。

使用try / catch上的finally块,您仍然必须处理被调用方法抛出的任何已检查异常 - 即使在catch块中也是如此。但是在显式抛出带有显式抛出运行时异常的finally块的已检查异常的情况下,编译器允许它,因为它确实知道事件的顺序是什么 - 在任何情况下随时都可以。