我的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";
}
}
}
答案 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块无法正常完成”。
答案 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