13

这就是我想要做的:

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

4 回答 4

23

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

于 2013-07-31T20:22:13.523 回答
6

finally总是无条件地执行,就像块做的最后一件事try-catch-finally一样。即使您Thread#stop对它执行,该finally块仍将执行,就像发生常规异常一样。

不仅如此,如果您从finally中返回,该返回值将践踏从tryor中返回的返回值catch

顺便说一句,您的第一个示例不仅很好,而且是首选。在第二个例子中,读者必须绕着变量赋值,这是一项乏味的工作,而且很容易让错误溜走。

于 2013-07-31T20:22:08.173 回答
4

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

int i = 0;

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

0是什么将被退回。

于 2013-07-31T20:24:09.263 回答
0

我只是想补充一点,它在规范中有所描述:

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

当然在哪里

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

于 2013-07-31T20:44:22.430 回答