首页 文章

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

提问于
浏览
0

这个问题在这里已有答案:

给出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?”我可以看到程序's output will be '这是最后的块'. However, I can' t弄清楚如何可能,因为print语句前面有一个返回...

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

3 回答

  • 0

    return 语句对 finally 块的执行没有影响 . 如果 JVM 在执行 finally block之前崩溃/退出,则不执行 finally 块的唯一方法 . 请查看此Link了解更多信息 . 因此,如果您的代码被替换为

    try{
      System.exit(0);
    }
    catch(SomeException e){
      System.out.println(e);
    }
    finally{
      System.out.println("This is the finally block");
    }
    

    finally 块将不会执行

  • 4

    finallyreturn 语句之前执行 . 由于java规则 finally 将始终执行,除非JVM崩溃或 System.exit() 被调用 .

    Java语言规范明确提到最终在不同条件下的执行:

    http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.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 .

相关问题