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#stopfinally 块仍将执行,就像发生常规异常一样。

不仅如此,如果您从finally 返回,则该返回值将践踏来自trycatch 的返回。

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

【讨论】:

我不同意..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中的异常

Java中try catch finally语句中含有return语句的执行情况

从 try catch finally 块中返回是不好的做法吗?

在 PHP Try Catch 块中抛出异常

Java中try catch finally语句中含有return语句的执行情况