为什么在最后尝试抓住,最终的回报总是如此?

时间:2012-10-06 14:44:48

标签: java

我的catch块中的return A代码会发生什么变化?

public class TryCatchFinallyTest {

    @Test
    public void test_FinallyInvocation()
    {
        String returnString = this.returnString();
        assertEquals("B", returnString);
    }

    String returnString()
    {
        try
        {
            throw new RuntimeException("");
        }
        catch (RuntimeException bogus)
        {
            System.out.println("A");
            return "A";
        }
        finally
        {
            System.out.println("B");
            return "B";
        }
    }
}

5 个答案:

答案 0 :(得分:3)

在方法的任何返回/退出之前,最终获得了。因此,当你这样做时

return "A";

它执行如下:

System.out.println("B");//Finally block
return "B";//Finally block
return "A";//Return from exception catch

因此返回“B”,而不是“A”

答案 1 :(得分:3)

也许return "A";被编译器优化掉了,也许不是,“A”只是被动态替换。事实上它没关系,因为你不应该有这个代码。

这是最终用于控制流的问题的经典示例之一:您丢失了一些指令,而另一个编码器可能看不到“意图”(实际上它只能是一个错误或恶作剧)。

您可能已经注意到javac发出警告“finally块无法正常完成”

<强> Don't return in a finally clause

答案 2 :(得分:0)

finally块将始终执行,而catch块仅在捕获到异常时执行。

答案 3 :(得分:0)

return "A"之前,将调用finally阻止return "B",您的return "A"将被跳过,永远不会被执行。因为finally块总是在方法的return语句之前执行,如果你从finally块返回一些内容,那么return语句就会try/catch。总会跳过。

注意:从finally块返回对Java程序员来说不是一个好习惯。如果您从finally块返回某些内容,JAVA编译器还会向您显示“ finally块无法正常完成”的警告。

答案 4 :(得分:0)

最后

您可以将finally子句附加到try-catch块。即使从try或catch块中抛出异常,finally子句中的代码也将始终执行。如果你的代码在try或catch块中有一个return语句,那么finally方块中的代码将在从方法返回之前执行。

参考http://tutorials.jenkov.com/java-exception-handling/basic-try-catch-finally.html