为什么使用return在try块中,finally块中的语句仍然会被执行?

3

我不明白为什么在try块中使用return语句后,finally块中的语句仍然会被执行。据我所知,return语句会将控制权返回给主程序。

如果在try块中使用了return语句,那么try块的执行应该在此结束并将控制权交回给主程序,为什么finally块中的语句还是会被执行呢?

class a
{
 public static void main(String arr[])

{    
 try
 {
 System.out.println("hello1");
 return;
 }

    finally
    {
    System.out.println("hello2");

    }

}
}

无论如何,finally 始终会执行。但是,在 finally 块中无法使用 return - Cᴏʀʏ
如果我没记错的话,finally 子句中的语句根据定义总是会被执行。 - Laurent S.
4个回答

3
无论你在 try 中做什么,finally 块总是会执行,即使你从 try 块中返回。来自 finally 文档。运行时系统始终会执行 finally 块中的语句,无论 try 块中发生了什么。因此,它是执行清理操作的完美场所。有趣的学习:当你谈论 return 和 try-finally 时,在 try 中放置 return,然后再在 finally 中返回。看看会发生什么 :)

1
@IRON-MAN,关于有趣的学习:还有一种有趣的情况是,如果try块抛出一个未被任何catch块捕获的异常,并且finally也抛出异常。提示:允许finally块抛出异常被认为是不好的编程风格。 - Solomon Slow
1
更有趣的是:看看使用 System.Exit 会发生什么。 - Bathsheba
@Bathsheba 我的天啊。我把JVM干掉了。警察马上就到了 ;)。 - Suresh Atta

3
因为这就是它的设计目的。这与 C++ 中的 catch (...) 不同(只有在其他位置没有被捕获时才会执行)。 finally 可以非常有用地清理资源:这是 Java 引入 RAII 类型特性的一种方式,在其他语言中(如通过析构函数的 C++)更为普遍。Java 更自然地通过垃圾回收来执行清理,但 finally 提供了一种替代方法。

RAII 类型语言 - MANU
是的,那是分类学家的放纵:我已经修改了。 - Bathsheba
@IRON-MAN,资源获取是...哦,去谷歌一下吧!RAII是一种常见的C++模式,其中,您可以使用局部变量的析构函数在函数退出时进行清理,等等。 - Solomon Slow
在C++中,任何局部对象的析构函数都是其等效物。 - CashCow

1

最后总会执行。你可以尝试使用一些条件语句(如if、else)来代替。


0
为什么在try块中使用return语句,finally块中的语句还是会被执行?
这是设计上的考虑。finally块的整个意义在于,无论你如何离开try块,finally中的代码都将被执行。除非你崩溃了JVM。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接