27

在 Java 中,如果我们在 try-catch-finally 的 try 块中插入 return 语句,finally 块会不会被执行?

4

8 回答 8

26

唯一finally不会执行块的时间是当您调用exit()beforefinally时。该exit()调用将关闭 JVM,因此不会运行后续代码行。

编辑:这并不完全正确。有关其他信息,请参阅下面的评论。

于 2011-08-22T06:28:26.973 回答
9

无论您是否返回,finally 块将始终执行,或者在 try 块中引发异常。

另请参阅Java 语言规范的第14.19.2 节执行 try-catch-finally

于 2011-08-22T06:22:14.740 回答
3

finally 块在所有这些情况下都会被执行。最后执行 finally 块的目的是让你释放所有获取的资源。

下面是一个例子,展示了它是如何工作的。

public class Hello {

    public static void hello(){
        try{
            System.out.println("hi");
            return;
            }catch(RuntimeException e){
        }finally{
            System.out.println("finally");

        }

    }

    public static void main(String[] args){
        hello();
    }
}
于 2011-08-22T06:27:22.247 回答
2

即使您在 try 块内返回,它也会被执行。我在 try 中放了一个 return 语句,在 finally 中放了一个,返回的值来自 finally,而不是来自 try。

public class HelloWorld{
   public static void main(String args[]){
      System.out.println(printSomething());
   }

   public static String printSomething(){
      try{
          return "tried";
      } finally{
          return "finally";
      }
   }
}

我得到的输出是“终于”。

于 2014-04-11T06:51:40.767 回答
0

根据官方解释

注意:如果在执行 try 或 catch 代码时 JVM 退出,则 finally 块可能不会执行。同样,如果执行 try 或 catch 代码的线程被中断或杀死,即使应用程序作为一个整体继续运行,finally 块也可能不会执行。

我认为在我们在这里发布答案之前,我们应该参考官方网站是一个好主意。

于 2014-05-18T22:59:09.487 回答
0

当一个方法试图通过未捕获的异常或显式的 return 语句返回给调用者时,finally 子句也会在方法返回之前执行。

于 2014-07-09T18:59:33.110 回答
0

如果您的 finally 块有返回,它将覆盖 try-catch 块中的任何返回。由于这个“功能”,一个好的做法是 finally 块不应该抛出异常或有返回语句。

于 2015-08-25T09:29:49.007 回答
-4

如果你System.exit()像别人说的那样调用,它不会被执行,但我相信如果except 块中有异常,不会被执行。

于 2014-07-09T17:25:06.430 回答