【问题标题】:Java - If I return in a catch block, will the finally block be executed? [duplicate]Java - 如果我在 catch 块中返回,finally 块会被执行吗? [复制]
【发布时间】: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 我进行了研究,但我不确定这是否是一件好事。有的话题说还行,有的说不太好。
  • 您现在确定相同的响应了吗?

标签: java scope try-catch-finally


【解决方案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 语句总是突然完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多