为什么finally中的代码会执行,即使它已经在try块中返回?

时间:2011-02-10 13:02:04

标签: java try-catch finally

代码:

public String get() {
try {
     //doSomething
     return "Hello";
}
finally {
     System.out.print("Finally");
}

public String get() { try { //doSomething return "Hello"; } finally { System.out.print("Finally"); } 这段代码是如何执行的?

3 个答案:

答案 0 :(得分:17)

因为这是finally块的整个点 - 它会执行,但是你会离开try块,除非VM本身突然关闭。

通常finally块用于清理资源 - 您不希望因为在try块期间返回而导致文件句柄保持打开状态,是吗?现在你可以在返回语句之前放置清理代码 - 但是如果代码抛出异常则不会清除它。使用finally,清理代码执行但是你离开了块,这通常是你想要的。

有关详细信息,请参阅JLS section 14.20.2 - 并注意所有路径如何执行finally块。

答案 1 :(得分:3)

最后 始终 会被执行,无论try块中发生什么(失败,返回,异常,完成等)。

如果您不希望执行此代码,则可以始终将其放在try / catch / finally语句之后。

答案 2 :(得分:0)

这正是finally的用途:中的代码将在try块被执行时执行,无论如何(除了JVM通过{{1关闭)或外部原因)。