try块中的可达中断语句

时间:2014-10-14 07:40:27

标签: java

JLS 14.21 提供了一些Unreachable statements的说明。特别是它说:

  

如果在中断内,则可到达的break语句退出语句   target,要么没有try块包含的try语句   break语句,或者有try块的try语句   包含break语句和那些try的所有finally子句   陈述可以正常完成。

我试图通过例子发现这个规则。我写了以下简单的测试程序:

public static void main(String[] args) throws java.lang.Exception {
    while (true) {
        try {                      //Try statement which contains a break statement.
            break;
        } 
        finally {                //Finally always complete abruptly 
            throw new Exception(); //because of throwing an exception.
        }

        try {                      //Compile-time error: Unreachable statement
        } 
        finally {                //That finally doesn't contain any instruction. 
            //It always complete normally.
        }
    }
}

除了在以下示例中抛出该异常外,我在该行为中没有发现任何异常:

public static void main(String[] args) throws java.lang.Exception {
    while (true) {
        try {
            break;
        } 
        finally {
            throw new Exception(); //Run-time error due to throwing an exception.
        }
    }
}

该规则的实际内容是什么?

1 个答案:

答案 0 :(得分:1)

如果控制流进入try / try块的finally部分,则finally部分将始终运行。 (这对于立即清理资源非常有用,因为依赖垃圾收集器是不明智的。)

唯一的例外是try部分中的一个关闭JVM的调用。例如System.exit(...)

在您的情况下,程序流程永远不会达到第二个try,因此第二个finally也无法访问。