Try-catch-finally in java



在Java中,如果我们插入一个return语句,finally块是否不会被执行

的try块

唯一不执行finally块的情况是在到达finally之前调用exit()exit()调用将关闭JVM,因此不会运行后续的代码行。

编辑:这并不完全正确。

无论你是否返回,或者在try块中抛出异常,finally块都将始终执行。

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

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();
    }
}

即使在try块内返回,也会执行。我在try中放了一条return语句,在finally中也放了一条return语句,返回的值来自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";
      }
   }
}

我得到的输出是"finally "。"

根据官方解释:

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

我认为在我们发表答案之前,我们应该先参考一下官方网站。

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

如果finally块有一个return,它将覆盖try-catch块中的任何return。由于这个"特性",一个好的实践是finally块永远不应该抛出异常或有一个返回语句。

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

相关内容

  • 没有找到相关文章

最新更新