Java 当涉及来自finally块的返回值时,在try块中使用return语句是一种好的做法吗

Java 当涉及来自finally块的返回值时,在try块中使用return语句是一种好的做法吗,java,Java,我想知道,从try块返回是否是一种好的做法 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

我想知道,从
try
块返回
是否是一种好的做法

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();
    }
  }
}

我首先想到将打印
false
。但是,以下是输出:

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块返回的值,我是否应该避免try返回?

您建议的代码(在问题的末尾)就可以了。您可以从
finally
块返回,但不应该返回,例如eclipse显示警告“finally块未正常完成”

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

至于您的问题-如果已返回,
finally
块中返回的变量的值不能更改。所以不要从
返回,试试

回答返回“true”的原因:

若变量是从try返回的,尽管返回的变量值在finally块中更改,但将返回以前设置的值(在本例中为try块中设置的值)。(当然,finally中没有返回语句)

回答您希望实现的目标:

若您希望更改finally块中要返回的值,则遵循第二种方法。i、 e:

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

虽然这被认为是不好的做法,但您最终可以返回
。这样做还胜过您在
try
catch
块中可能遇到的任何其他
return
s。证明:

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());
    }
}
将打印“最终返回”。在电视上看

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


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

如果您需要返回依赖于finally块中运行的代码的内容,那么您需要将您的返回放在try块之外;正如其他人所说的,只有一个返回语句是一种好的做法


话虽如此,我从未遇到过返回值依赖于finally块中的计算的情况,我通常会将返回值放在try中。

return
语句指示返回的值,而执行
return
语句时返回的值是
true
最后
确实会更改变量
的值,但这不会更改已执行的
return
语句返回的值

您可以在
finally
中添加另一个返回值,该返回值将覆盖
try
中的
返回值:

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;
  }

顺便说一句,变量名应更改为
everythingIsFine
根据当前的;-)

在finally块中对所有内容的赋值都很好,不会影响返回的内容。在我看来这是一个糟糕的做法。意图是什么?

@NullUserException请尝试同样的方法并予以批准。还有一些情况下,finally并不总是executed@NullUserException您正在展示的示例在finally中有“return”语句。我的回答的意思是,若变量是从try返回的,尽管在finally中该变量的值发生了更改,但会返回较早的值。当然,如果最终没有返回其他内容。将更新我的答案。@YoK我不知道你的意思。我想不出用
try
块的返回值代替
finally
块的返回值的方法。@YoK如果OP在
finally
块中有一个
return false
,该方法将返回false。当然,如果在<代码>中没有返回到最后的<代码>块,它将使用最后的返回(<代码>真/ <代码>从<代码>尝试/代码>块),尽管它可能从最后块返回,但我不认为它是好的实践。我在回答中也是这么说的。所以你们的回答并不相关,因为这个问题是关于良好实践的。此外,finally不会在比您所说的更多的情况下执行,例如:如果执行try或catch代码的线程被中断或终止,这意味着更多的是注释而不是答案,但是太长了,无法放入注释。所以您将注释放在了答案部分?告诉我你希望我做什么?@NullUserException我的意思是另一件事,在这个问题的上下文中,它应该是完全可见的。然而,我重新表述了最后一句话,这样即使在问题的上下文之外也是正确的。如果有疑问,请以明确、直观的方式编写代码。