【问题标题】:try-catch-finally with return after ittry-catch-finally 后返回
【发布时间】:2014-04-27 07:22:41
【问题描述】:

我知道 try、catch 和 finally 是如何工作的(大部分情况下),但我想知道一件事:在 try-catch-finally 之后的 return 语句会发生什么,而我们已经在 try 中有 return (或抓住)?

例如:

public boolean someMethod(){
    boolean finished = false;
    try{
        // do something
        return true;
    }
    catch(someException e){
        // do something
    }
    finally{
        // do something
    }
    return finished;
}

假设尝试没有出错,所以我们返回 true。然后我们会去 finally 我们做一些像关闭一个连接的事情,然后呢?

我们在finally中做了一些事情之后方法会停止(所以方法在try中返回true),还是在finally之后方法继续,导致返回finished(即假)?

提前感谢您的回复。

【问题讨论】:

  • 为什么不能直接执行代码,看看它返回什么值?
  • 因为他在公共汽车上,只是想知道^^

标签: java return try-catch try-catch-finally finally


【解决方案1】:

finally 块被执行的事实不会让程序忘记你返回。如果一切顺利,finally块之后的代码就不会被执行。

这是一个清楚的例子:

public class Main {

    public static void main(String[] args) {
        System.out.println("Normal: " + testNormal());
        System.out.println("Exception: " + testException());
    }

    public static int testNormal() {
        try {
            // no exception
            return 0;
        } catch (Exception e) {
            System.out.println("[normal] Exception caught");
        } finally {
            System.out.println("[normal] Finally");
        }
        System.out.println("[normal] Rest of code");
        return -1;
    }

    public static int testException() {
        try {
            throw new Exception();
        } catch (Exception e) {
            System.out.println("[except] Exception caught");
        } finally {
            System.out.println("[except] Finally");
        }
        System.out.println("[except] Rest of code");
        return -1;
    }

}

输出:

[normal] Finally
Normal: 0
[except] Exception caught
[except] Finally
[except] Rest of code
Exception: -1

【讨论】:

    【解决方案2】:

    如果一切顺利,则在执行finally 块之后执行try 内部的返回。

    如果try内部出现问题,exception被捕获并执行,然后finally块被执行,然后执行返回。

    【讨论】:

    • @JqueryLearner 是什么让你认为它无法访问?
    • @JqueryLearner finally 块不是结束。试试看。之后的所有代码都将是完全可访问的。最后什么都不返回。它只是一段在不知道是否有异常的情况下执行的代码。
    • @JqueryLearner 不过出于不同的原因。将 return 放在 finally 中,并在 tryblock 中放置实际上可能 引发异常的东西。它将编译并运行。
    • @JqueryLearner 因为你在 finally 块中放了一个 return。这使得之后的一切都无法访问。
    • @Fildor 是我的错,我认为 OP 在 finally 块中也有 return 语句。所以所有这些讨论都没有用。对不起
    【解决方案3】:

    在这种情况下,finally 中的代码会运行,但在没有异常时会跳过另一个返回。 你也可以通过记录一些东西自己看到这一点:)

    另请参阅有关System.exit 的内容: How does Java's System.exit() work with try/catch/finally blocks?

    看看从 finally 中返回: Returning from a finally block in Java

    【讨论】:

    • “那个案例”的意思是“没有例外”,而“另一个返回”是 finally 块之后的那个,对吧? (只是为了说清楚)
    • @Fildor 如果出现异常,将使用第二次返回,但仍然执行 finally 块。正如我所说,您可以尝试自己在主程序中的一个小程序中执行此操作,看看 system.out 或日志记录或断点会发生什么
    • 我知道这一点。我刚刚发现您使用的措辞有些模棱两可...
    • @Fildor 是的,我只介绍了这个案例,没有例外,因为我认为这是最有趣的。这是关闭资源的默认 pre Java 7 方式(使用 finally)。
    • 如果我没记错的话,建议不要在 try 中返回,而是设置 finished 并让它只返回一个地方。
    【解决方案4】:
    public int Demo1()
        {
            try{
                System.out.println("TRY");
                throw new Exception();
                }catch(Exception e){
                    System.out.println("CATCH");
                }finally{
                    System.out.println("FINALLY");
                }return 0;
    
        }
    

    调用这个方法的输出是这样的

    TRY
    CATCH
    FINALLY
    0
    

    意味着将Try{}catch{}finally{} 视为在这种特殊情况下一个接一个执行的语句序列。 然后控制权返回。

    【讨论】:

      【解决方案5】:

      try里面的代码肯定会执行..但是当它到达return语句时..它会移动到finally块而不执行try块中的return语句..然后会执行finally的代码然后try 的 return 语句将执行。

      【讨论】:

      • @Narendra11744 没有。如果您不知道结果,请尝试一些代码,但请不要输入错误的答案。如果没有发生异常,在finally块之后,会执行try中的return语句,没有别的。
      猜你喜欢
      • 2016-03-28
      • 2018-11-05
      • 2021-05-30
      • 2011-11-04
      • 2014-11-27
      • 2015-10-24
      • 2013-06-28
      • 2012-02-10
      • 1970-01-01
      相关资源
      最近更新 更多