try-catch-finally 后返回

Posted

技术标签:

【中文标题】try-catch-finally 后返回【英文标题】:try-catch-finally with return after it 【发布时间】: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(即假)?

提前感谢您的回复。

【问题讨论】:

为什么不能直接执行代码,看看它返回什么值? 因为他在公共汽车上,只是想知道^^ 【参考方案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

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

【讨论】:

【参考方案5】:

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

【讨论】:

@Narendra11744 没有。如果您不知道结果,请尝试一些代码,但请不要输入错误的答案。如果没有发生异常,在finally块之后,会执行try中的return语句,没有别的。

以上是关于try-catch-finally 后返回的主要内容,如果未能解决你的问题,请参考以下文章

try-catch-finally的执行顺序

C# - Try-Catch-Finally 返回 [重复]

try-catch-finally对返回值的影响

try-catch-finally 中哪个部分可以省略?try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

try-catch-finally

try-catch-finally执行顺序