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.
}
}
}
该规则的实际内容是什么?
答案 0 :(得分:1)
如果控制流进入try
/ try
块的finally
部分,则finally
部分将始终运行。 (这对于立即清理资源非常有用,因为依赖垃圾收集器是不明智的。)
唯一的例外是try
部分中的一个关闭JVM的调用。例如System.exit(...)
。
在您的情况下,程序流程永远不会达到第二个try
,因此第二个finally
也无法访问。