Java - 如果我在 catch 块中返回,finally 块会被执行吗? [复制]
Posted
技术标签:
【中文标题】Java - 如果我在 catch 块中返回,finally 块会被执行吗? [复制]【英文标题】:Java - If I return in a catch block, will the finally block be executed? [duplicate] 【发布时间】:2013-08-01 13:21:25 【问题描述】:这就是我想要做的:
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;
【问题讨论】:
自己试过了吗? 重复警告!你试过搜索吗?这已经被问过好几次了...... @devnull 我进行了研究,但我不确定这是否是一件好事。有的话题说还行,有的说不太好。 您现在确定相同的响应了吗? 【参考方案1】:是的,它会的。唯一可以阻止 finally 块执行 (AFAIR) 的是 System.exit()
和无限循环(当然还有 JVM 崩溃)。
【讨论】:
... 和停电 :) (爆炸,你添加 JVM 崩溃毁了它) 但是我的第一个例子是不好的做法吗? 有趣的是,很多人都忽略了,Thread#stop
将不会阻止 finally
执行。
@Thecoolguyacrossthestreet 我想说第一个是最简单的,我会做的。【参考方案2】:
finally
块总是无条件地执行,就像try-catch-finally
块做的最后一件事一样。即使您对它执行Thread#stop
,finally
块仍将执行,就像发生常规异常一样。
不仅如此,如果您从finally
返回,则该返回值将践踏来自try
或catch
的返回。
顺便说一句,您的第一个示例不仅很好,而且是首选。在第二个例子中,读者必须绕着变量赋值,这是一项乏味的工作,而且很容易让错误溜走。
【讨论】:
我不同意..btw
部分,我认为只有一个退货声明更好,但这让我在这里找到了相关信息(一次退货的概念从何而来)[@ 987654321@
写得真好! (第一个答案)【参考方案3】:
两者大致相同。但是,请注意以下情况:
int i = 0;
try
//code
catch(Exception e)
return i;
finally
i = 1;
0
将返回。
【讨论】:
那我觉得我的例子不是一个好习惯,对吧? @Thecoolguyacrossthestreet 最好的做法是尽可能使用干净的代码。【参考方案4】:我只是想补充一点,它在the specs 中有所描述:
如果 catch 块由于原因 R 突然完成,则执行 finally 块。
当然在哪里
可以看出,return 语句总是突然完成。
【讨论】:
以上是关于Java - 如果我在 catch 块中返回,finally 块会被执行吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs:catch块中的回调函数在try-catch中返回未定义的参数
Java中try catch finally语句中含有return语句的执行情况