Java - If I return in a catch block, will the finally block be executed?
这就是我要做的:
1 2 3 4 5 6 7 8 9 10
| try {
//code
} catch (Exception e ) {
return false;
} finally {
//close resources
} |
这行吗?这是不好的做法吗?这样做更好吗:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| boolean inserted = true;
try {
//code
} catch (Exception e ) {
inserted = false;
} finally {
//close resources
}
return inserted ; |
号
- 试过了吗?
- 重复警报!你试过搜索吗?这已经被问了好几次了…
- @我研究过,但我不确定这是否是一件好事。有些话题说可以,而其他人说不太好。
- 你现在确定相同的回答吗?
是的,会的。唯一能阻止执行finally块(afair)的是System.exit()和无限循环(当然还有一个JVM崩溃)。
- …还有停电:(爆炸,你加上JVM崩溃把它毁了)
- 但我的第一个例子是一个坏的实践吗?
- 有趣的是,被许多人忽视的是,Thread#stop不会阻止finally执行。
- @哥们儿穿过街道:不,不是。很好。
- @我想说的是,第一个是最简单的,我会做什么。
- @如果在finally块中也有一个返回语句,那么coolguecrossstreet将是一个糟糕的实践,因为在这种情况下,catch块的返回语句将是无用的。
- @我看到了圣战节…谢谢。在本例中,我将使用第一个示例。我一定记得在最后一个街区什么都不要还。
- @哥们儿们,快跑吧!
- 只需添加,如果主线程退出,最后一个守护进程线程块也不会执行。
总是无条件地执行finally块,就像try-catch-finally块所做的最后一件事一样。即使对其执行Thread#stop,finally块仍将执行,就像发生了常规异常一样。
不仅如此,如果您从finally返回,该返回值将超过try或catch的返回值。
顺便说一句,你的第一个例子不仅是好的,而且是首选的。在第二个示例中,读者必须围绕变量的赋值进行搜索,这是一项繁琐的工作,可以很容易地让错误溜走。
- 我不同意..btw 部分的观点,我认为最好只有一个退货声明,但这让我发现了这一点(一个退货的概念是从哪里来的)〔programmers.stackexchange.com/questions/118703/…
- 写得不错!(第一个答案)
两者大致相同。但是,注意以下情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int i = 0;
try
{
//code
}
catch(Exception e )
{
return i ;
}
finally
{
i = 1;
} |
0是将要返回的。
- 那么我认为我的例子不是一个好的实践,对吧?
- @解决方案的最佳实践是尽可能使用干净的代码。
我只是想补充一下,它在规范中有描述:
If the catch block completes abruptly for reason R, then the finally block is executed.
号
当然在哪
It can be seen, then, that a return statement always completes abruptly.
号