代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

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

  •  18
  • Cheok Yan Cheng  · 技术社区  · 14 年前

    return 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
    

    如你所见,如果我 返回 内的语句 尝试 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返回吗?

    6 回复  |  直到 14 年前
        1
  •  18
  •   Bozho    14 年前

    你建议的代码(在问题的最后)是好的。你呢 从机场回来 finally 块,但您不应该这样做—例如,eclipse显示一个警告“finally block does not complete normaly”。

    try/finally return . 在这里似乎是这样,因为它是方法中唯一的构造,但是您可以在之后使用其他代码(例如事件通知),然后返回。

    至于你的问题-你不能改变 返回的变量 最后 try .

        2
  •  3
  •   samitgaur    14 年前

    这个 return 语句指定要返回的值,在 执行的语句是 true finally everything_is_fine ,但这不会改变已执行的 返回 已返回语句。

    能够 在中添加其他退货 它将覆盖 返回 里面 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;
        }
      }
    

    但是,使用 最后 修改控制流被认为是不好的做法。它 当然有可能。在您的情况下,更好的方法是:

    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 按现行标准 Java naming conventions ;-)

        3
  •  2
  •   YoK    14 年前

    返回“true”的原因:

    如果从try返回变量,尽管返回的变量值在finally块中发生了更改,但将返回先前设置的值(在本例中是try块中设置的值)。(当然,finally中没有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;
      }
    
        4
  •  2
  •   NullUserException Mark Roddy    14 年前

    可以 finally . 这样做也胜过任何其他方法 return 你可能在你的房间里 try catch 阻碍。证明:

    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 .

    这个 最后 始终执行块(禁止调用 System.exit()

    编辑: 注意,在第一个代码示例中,在 但是如果你有 return false

        5
  •  2
  •   user207421    14 年前

    finally块中对所有内容的赋值\u is \u fine并不影响返回的内容。在我看来这是一个糟糕的做法。目的是什么?

        6
  •  0
  •   dsmith    14 年前

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

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