[英]How does a return statement work after a finally block in java?
这是“Java All-in-one桌面参考”一书中的一个例子
public class CrazyWithZeros {
public static void main(String[] args) {
try {
int answer = divideTheseNumbers(5, 0);
} catch (Exception e) {
System.out.println("Tried twice, still didn't work!");
}
}
public static int divideTheseNumbers(int a, int b) throws Exception {
int c;
try {
c = a / b;
System.out.println("It worked!");
} catch (Exception e) {
System.out.println("Didn't work the first time.");
c = a / b;
System.out.println("It worked the second time!");
} finally {
System.out.println("Better clean up my mess.");
}
System.out.println("It worked after all.");
return c;
}
}
执行finally子句后,ArithmeticException将被抛回到调用方法。 语句System.out.println("It worked after all.");
在这种情况下永远不会被执行。 但是return c;
发生了什么return c;
?
我想知道返回陈述是否仍会返回分裂的结果?
========
我试图替换“ System.out.println("Better clean up my mess.");
”with“ System.out.println(c);
”,然后它被编译,结果如下:
Didn't work the first time. 0 Tried twice, still didn't work!
我无法相信变量c
可以计算出来。 (但这是错误的数字)为什么会发生这种情况?
然后我也尝试替换“ System.out.println("Better clean up my mess.");
”with“ return c;
”并删除finally块下面的语句,再次编译...由于finally块是执行是否由try块抛出任何异常或由任何catch块捕获,返回c; 应该执行。 但结果如下:
第一次没工作。
看起来像c
无法返回...
也不执行return c。 它直接进入main方法中的catch块。
您希望第二次执行容易出错的操作是什么? :)
它会生成一个与catch
块中相同类型的异常,但是当时它不会被处理 - 你在这个 catch
块中没有另一个try-catch
。
无论是否发生异常或正常的流程进行,都始终执行finally
。 在你的情况下,你来到带有异常的finally
块并将它抛给调用者( main
),在那里它由自己的catch
块处理。
我想知道返回陈述是否仍会返回分裂的结果?
你想要什么回报? 您尚未初始化变量c
并且此变量没有正确的记录。 因此,Java不允许在c
写入“意外或不可预测的东西”。
finally
块对return语句是否执行没有任何影响。 (当然, finally
块不应该抛出任何进一步的异常) catch
块确定是否应该进一步传播该异常或在该方法中处理该异常。 在给定的示例中,从try
块抛出ArithmeticException
,它将由相应的catch
块处理。 由于catch
块再次抛出相同的异常,因此return
语句永远不会执行。
简而言之, return c;
永远不会在上面的程序中执行,变量c
将被删除为任何其他局部变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.