3 回答
TA贡献1788条经验 获得超4个赞
如果到达return了该try块中的in ,它将控制权转移到该finally块,该函数最终将正常返回(不是抛出)。
如果发生异常,但是代码return从该catch块到达a ,则控制权转移到该finally块,并且该函数最终正常返回(不是抛出)。
在你的榜样,你有return在finally,所以不管发生什么情况,该函数将返回34,因为finally有最后的(如果你愿意)字。
尽管您的示例中未涉及,但即使您没有,catch并且如果在try块中引发了异常且未捕获到异常,这也将是正确的。通过return从finally块执行a ,可以完全抑制异常。考虑:
public class FinallyReturn {
public static final void main(String[] args) {
System.out.println(foo(args));
}
private static int foo(String[] args) {
try {
int n = Integer.parseInt(args[0]);
return n;
}
finally {
return 42;
}
}
}
如果您在不提供任何参数的情况下运行它:
$ java最终返回
...中的代码foo引发ArrayIndexOutOfBoundsException。但是因为该finally块执行a return,所以该异常得到抑制。
这就是为什么最好避免使用returnin的原因之一finally。
TA贡献1809条经验 获得超8个赞
这是一些显示其工作原理的代码。
class Test
{
public static void main(String args[])
{
System.out.println(Test.test());
}
public static String test()
{
try {
System.out.println("try");
throw new Exception();
} catch(Exception e) {
System.out.println("catch");
return "return";
} finally {
System.out.println("finally");
return "return in finally";
}
}
}
结果是:
try
catch
finally
return in finally
TA贡献1813条经验 获得超2个赞
一个块中的return
a catch
将“正常”完成,而不是“突然”完成。从第11节中可以很明显地看出这一点:“在引发异常的过程中,Java虚拟机突然一个一个地完成了所有已经开始但尚未完成的表达式,语句,方法和构造函数调用,初始化程序以及字段初始化表达式。在当前线程中执行。”
添加回答
举报