首页 > 解决方案 > catch 块中的 throw 语句如何防止未初始化变量的编译器错误?

问题描述

我试图弄清楚这段代码的内部工作原理。

public void method() {
    int x;
    try {
        x = 10;
    } catch(Exception e) {
        throw new RuntimeException(); //commenting out this line causes error
    }
    System.out.println("x: " + x);
}

当我注释掉第 6 行时,我在第 8 行收到一个编译错误,表明 x 可能尚未初始化。当我将 throw 语句保留在 catch 块中时,我没有收到这样的错误。这有什么区别?在我看来,您可以在 try 块内初始化一个变量并在外部使用该值,或者您不能。无论如何,实际上不会抛出异常,因为从未进入 catch 块。当然,仅仅抛出异常的可能性并不会导致编译器允许违反 Java 语法的行为,对吧?

标签: javaexception

解决方案


我不能说是否有任何真正的异常可能发生在try-可能会发生,但不会被抓住- 但我相信这只是由于编译器格外小心(也许是不必要的)。OutOfMemoryError catch (Exception e)

块内的行try不引发异常无关紧要。相反,它正在评估如果在语句中(以某种方式)抛出异常try并且随后允许执行继续超过该catch子句,则将x处于未初始化状态。

确切的答案很可能隐藏在 Java 语言规范中,可能在14.21 中。无法访问的语句14.20.1。执行 try-catch


推荐阅读