Java 为什么在最后的一次尝试中,回报总是最后的?
在我的catch块中,Java 为什么在最后的一次尝试中,回报总是最后的?,java,Java,在我的catch块中,返回一个代码会发生什么情况 public class TryCatchFinallyTest { @Test public void test_FinallyInvocation() { String returnString = this.returnString(); assertEquals("B", returnString); } String returnString() {
返回一个
代码会发生什么情况
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";
}
}
}
finally块将始终执行,而catch块仅在捕获到异常时执行 在方法的任何返回/退出之前执行finally get。因此,当你
return "A";
它是这样执行的:
System.out.println("B");//Finally block
return "B";//Finally block
return "A";//Return from exception catch
因此,返回的是“B”,而不是返回“A”之前的“A”,最后将调用块,该块将返回“B”
,您的返回的“A”
将被跳过,并且永远不会执行。这是因为finally
块总是在方法的return
语句之前执行,如果您是从finally
块返回某些内容,那么try/catch
语句的return
语句总是会被跳过
注意:对于Java程序员来说,从finally
块返回不是一个好的实践。如果从finally
块返回内容,JAVA编译器还会向您显示警告“finally块未正常完成”。可能返回“A”代码>被编译器优化掉了,也许不是,而“A”只是被动态替换。事实上,这并不重要,因为您不应该拥有此代码
这是将finally用于控制流的经典问题示例之一:您丢失了一些指令,另一个程序员可能看不到“意图”(事实上,它可能只是一个bug或一个恶作剧)
您可能已经注意到javac发出警告“finally block不能正常完成”
最后
可以将finally子句附加到try-catch块。即使从try或catch块中抛出异常,finally子句中的代码也将始终被执行。如果您的代码在try或catch块中有一个return语句,那么finally块中的代码将在从方法返回之前执行
References这篇引文没有明确说明所考虑的返回语句是finally块的语句。请看最后一行,finally块将在返回之前执行。因此,当return语句找到时,它将调用实际返回的finally块。以下是我能找到的JLS中最相关的部分:。这说明,如果catch块成功完成,那么将执行finally块。在我自己运行了一个示例并阅读了该部分之后,这使我相信在本例中catch块的return语句被丢弃了。当然,您可能会询问JVM实现显式执行的详细信息,而不是JVM应该显示的行为。你能澄清一下你在找什么吗?