4

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

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

5 回答 5

3

finally get 在任何返回/退出该方法之前执行。因此,当你这样做

return "A";

它执行如下:

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

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

于 2012-10-06T14:48:13.890 回答
3

也许return "A";编译器优化了,也许不是,“A”只是动态替换。事实上,这并不重要,因为您不应该拥有此代码。

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

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

不要在 finally 子句中返回

于 2012-10-06T14:53:01.993 回答
0

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

于 2012-10-06T14:47:58.260 回答
0

Finally

You can attach a finally-clause to a try-catch block. The code inside the finally clause will always be executed, even if an exception is thrown from within the try or catch block. If your code has a return statement inside the try or catch block, the code inside the finally-block will get executed before returning from the method.

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

于 2012-10-06T14:54:58.057 回答
0

之前return "A"finallyblock 将被调用,这将被跳过并且return "B"return "A"将被跳过并且永远不会被执行。这是因为finally块总是在return方法的语句之前执行,如果你从finally块中返回一些东西,那么你的return语句try/catch总是会被跳过。

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

于 2012-10-06T14:52:38.493 回答