当涉及从finally块返回的值时,在try块中有return语句是好的做法

我想知道,从tryreturn是一种好习惯吗?

 package debug; /** * * @author Owner */ public class Main { public static void main(String[] args) { System.out.println(fun()); } static boolean cleanup() { // Fail to cleanup. return false; } static boolean fun() { boolean everything_is_fine = true; try { System.out.println("open file stream"); return everything_is_fine; } finally { everything_is_fine = cleanup(); } } } 

我首先想到的是会打印出来的。 但是,这是输出:

 open file stream true 

如您所见,如果我在try块中有return语句,我将在finally清理期间错过失败状态。

我应该把代码作为:

  static boolean fun() { boolean everything_is_fine = true; try { System.out.println("open file stream"); } finally { everything_is_fine = cleanup(); } return everything_is_fine; } 

只要涉及finally块的返回值,我是否应该避免从尝试返回?

您建议的代码(在问题的最后)是好的。 你可以finally块返回,但你不应该 – 例如eclipse显示警告“finally块没有正常完成”。

实际上, try/finallyreturn没有直接关系。 这似乎是这样,因为它是方法中唯一的构造,但是之后你可以有其他代码(例如 – 事件通知),然后返回。

至于你的问题 – 如果已经返回,你不能在finally块中更改返回变量的值。 所以不要从try返回。

return语句指示return值,在return语句执行时为truefinally确实改变了变量everything_is_fine的值,但这并没有改变已经执行的return语句返回的内容。

可以finally添加另一个返回,它将覆盖try里面的return

 static boolean fun() { boolean everything_is_fine = true; try { System.out.println("open file stream"); return everything_is_fine; } finally { everything_is_fine = cleanup(); return everything_is_fine; } } 

但是, finally使用修改控制流程并不是一种好的做法。 但这当然是可能的。 在您的情况下,更好的方法是:

 static boolean fun() { boolean everything_is_fine = true; try { System.out.println("open file stream"); } finally { everything_is_fine = cleanup(); } return everything_is_fine; } 

顺便说一句,变量名应根据流行的Java命名约定更改为everythingIsFine 😉

回答为什么返回“true”:

如果从try返回变量,虽然在finally块中更改了返回的变量值,但将返回先前设置的值(在这种情况下,在try块中设置的值)。 (当然最后没有退货声明)

回答你想要达到的目标:

如果您希望更改要在finally块中返回的值,请按照第二种方法进行操作。 即:

  static boolean fun() { boolean everything_is_fine = true; try { System.out.println("open file stream"); } finally { everything_is_fine = cleanup(); } return everything_is_fine; } 

虽然它被认为是不好的做法,但你可以 finally回归。 这样做也可以胜过你在trycatch块中可能遇到的任何其他return 。 certificate:

 class Main { public static String test() { try { except(); return "return from try"; } catch (Exception e) { return "return from catch"; } finally { return "return from finally"; } } public static void except() throws Exception { throw new Exception(); } public static void main(String[] args) { System.out.println(test()); } } 

将打印“从最后返回”。 在ideone上看到它。

始终执行finally块(禁止调用System.exit()或拔出电源插头)

编辑:请注意,在您的第一个代码示例中, finally块中没有返回任何内容,但如果您在那里return false ,则您的方法将始终返回false。

finally块中对everything_is_fine的赋值不会影响返回的内容。 对我来说,这看起来很糟糕。 意图是什么?

如果你需要返回一个依赖于在finally块中运行的代码的东西,那么你需要将你的返回放在try块之外; 正如其他人所说,只有一份退货声明是一种好习惯。

说到这一点,我从来没有遇到过我的返回值依赖于finally块中的计算的情况,我通常将返回值放在try中。