繁体   English   中英

在java中尝试catch-finally

[英]Try-catch-finally in java

在Java中,如果我们在try-catch-finally的try块中插入一个return语句,那么finally块是否会被执行?

只有在finally到达之前调用exit()时才会执行finally块。 exit()调用将关闭JVM,因此不会运行任何后续代码行。

编辑:这不完全正确。 有关其他信息,请参阅以下注释。

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

另请参见第14.19.2节“Java语言规范” 的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块内返回也会执行它。 我把一个return语句放在try里面,最后放在一个里面,返回的值来自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";
      }
   }
}

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

根据官方解释

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

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

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

如果你的finally块有一个返回,它将覆盖try-catch块中的任何返回。因为这个“特性”一个好的做法是finally块永远不应该抛出异常或者有一个return语句。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM