Java - If I return in a catch block, will the finally block be executed? 
这就是我要做的:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | try {
    //code
} catch (Exception e) {
    return false;
} finally {
    //close resources
} | 
这行吗?这是不好的做法吗?这样做更好吗:
| 12
 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/…
- 写得不错!(第一个答案)
 
	 
两者大致相同。但是,注意以下情况:
| 12
 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.
号