try / catch块返回java中的finally子句

时间:2013-11-11 05:01:10

标签: java return try-catch try-catch-finally

在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语句前面有一个返回...

我怀疑这种行为与线程有关,但我不确定。请赐教。谢谢。

3 个答案:

答案 0 :(得分:4)

finallyreturn语句之前执行。由于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。