在 Java 中,如果我们在 try-catch-finally 的 try 块中插入 return 语句,finally 块会不会被执行?
8 回答
唯一finally
不会执行块的时间是当您调用exit()
beforefinally
时。该exit()
调用将关闭 JVM,因此不会运行后续代码行。
编辑:这并不完全正确。有关其他信息,请参阅下面的评论。
无论您是否返回,finally 块将始终执行,或者在 try 块中引发异常。
另请参阅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 中放了一个,返回的值来自 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 块也可能不会执行。
我认为在我们在这里发布答案之前,我们应该参考官方网站是一个好主意。
当一个方法试图通过未捕获的异常或显式的 return 语句返回给调用者时,finally 子句也会在方法返回之前执行。
如果您的 finally 块有返回,它将覆盖 try-catch 块中的任何返回。由于这个“功能”,一个好的做法是 finally 块不应该抛出异常或有返回语句。
如果你System.exit()
像别人说的那样调用,它不会被执行,但我相信如果except 块中有异常,它也不会被执行。