Java - 如果我在catch块中返回,是否会执行finally块?

时间:2013-07-31 20:20:09

标签: java scope try-catch-finally

这就是我要做的事情:

try {

    //code
} catch (Exception e) {

    return false;
} finally {

    //close resources
}

这会有用吗?这是不好的做法吗?这样做会更好:

boolean inserted = true;

try {

    //code
} catch (Exception e) {

    inserted = false;
} finally {

    //close resources
}

return inserted;

4 个答案:

答案 0 :(得分:23)

是的,它会的。唯一可以阻止finally块执行的东西(AFAIR)是System.exit()和无限循环(当然还有JVM崩溃)。

答案 1 :(得分:6)

作为finally块的最后一件事,try-catch-finally块始终无条件地执行。即使你对它执行Thread#stopfinally块仍然会执行,就像发生常规异常一样。

不仅如此,如果您从finally返回,则该返回值将会覆盖trycatch的返回值。

BTW你的第一个例子不仅很好,而且更受欢迎。在第二个例子中,读者必须追逐变量的赋值,这是一项繁琐的工作,让bug很容易漏掉。

答案 2 :(得分:4)

两者大致相同。但是,请注意以下情况:

int i = 0;

try
{
    //code
}
catch(Exception e)
{
    return i;
}
finally
{
    i = 1;
}

0将返回。

答案 3 :(得分:0)

我只是想补充一下the specs中描述的内容:

  

如果catch块由于原因R突然完成,则执行finally块。

当然在哪里

  

然后可以看出,return语句总是突然完成。