当涉及从finally块返回的值时,在try块中有return语句是好的做法
我想知道,从try
块return
是一种好习惯吗?
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/finally
与return
没有直接关系。 这似乎是这样,因为它是方法中唯一的构造,但是之后你可以有其他代码(例如 – 事件通知),然后返回。
至于你的问题 – 如果已经返回,你不能在finally
块中更改返回变量的值。 所以不要从try
返回。
return
语句指示return
值,在return
语句执行时为true
。 finally
确实改变了变量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
回归。 这样做也可以胜过你在try
和catch
块中可能遇到的任何其他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中。