在java中给出以下try / catch块:
try{
return;
}
catch(SomeException e){
System.out.println(e);
}
finally{
System.out.println("This is the finally block");
}
根据这篇文章:“Does finally always execute in Java?”我可以看到程序的输出将是'这是最后的块'。但是,我无法弄清楚这是怎么可能的,因为print语句前面有一个返回...
我怀疑这种行为与线程有关,但我不确定。请赐教。谢谢。
答案 0 :(得分:4)
finally
在return
语句之前执行。由于Java规则finally
将始终执行,除非JVM崩溃或System.exit()
被调用。
Java语言规范明确提到最终在不同条件下的执行:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2
答案 1 :(得分:0)
return
语句对finally
块的执行没有影响。如果finally
在执行JVM
块之前崩溃/退出,则finally
块未执行的唯一方法。查看此Link了解更多信息。因此,如果您的代码被
try{
System.exit(0);
}
catch(SomeException e){
System.out.println(e);
}
finally{
System.out.println("This is the finally block");
}
finally
块不会执行
答案 2 :(得分:0)
Juned是正确的。我还想提醒一下从finally块中抛出异常,它们会扼杀其他发生的异常。例如(有些愚蠢的例子,但它说得好):
boolean ok = false;
try {
// code that might throw a SQLException
ok = true;
return;
}
catch (SQLException e) {
log.error(e);
throw e;
}
finally {
if (!ok) {
throw new RuntimeException("Not ok");
}
}
在这种情况下,即使捕获并重新抛出SQLException,finally也会抛出一个RuntimeException,它将“屏蔽”或覆盖SQLException。调用者将收到RuntimeException而不是SQLException。