试一试try最后用例 -
public class Finallyy {
public static void main(String[] args) {
int result = method1();
System.out.println(result);
}
private static int method1() {
int a = 2;
try {
int b = 0;
a = a / a;
System.out.println("try");
return a;
} catch (Exception e) {
System.out.println("caught");
a = 5;
return a;
}
finally {
System.out.println("finally");
a = 10;
return a;
}
}
}
输出:
try
finally
10
如果代码修改为
finally {
System.out.println("finally");
a = 10;
//return a;
}
输出:
try
finally
1
问题 - 是否存在堆栈的概念,其中return a
块中的“try
”存储[如果示例被更改,则它适用于尝试或捕获阻止],并且当控件在method1()
块中没有“return
”时离开finally
时弹出?
更新:解决方案结束:
执行return语句时,将存储要返回的值。当finally块完成时,返回该值。
finally块始终作为最后执行。所以finally块中的返回OVERWRITES,其他返回try / catch块。由于这个原因,从finally块返回或抛出异常是一种非常糟糕的做法。
那么对于原始问题 - 只有在return
块中没有“finally
”时才会出现这种情况吗?没有。没关系。
修改
这个问题在4月8日被问到并且已经回答了。目前标记为重复的问题是日后[8月15日]提出的问题。因此,新问题应被标记为重复,而不是这个。然而,分享参考类似的问题是好的。
答案 0 :(得分:2)
try
阻止在finally
阻止之前执行。
执行return
语句时,将存储要返回的值。当finally
块完成时,将返回该值。
请注意,a
不是值。 a
是存储值的变量。如果您更改a
,则更改a
,则不会更改为return
存储的值。
由于技术原因,我们转到Java Language Specification on the try-finally
block
如果由于任何其他原因导致try块的执行突然完成 R,然后执行finally块,然后有一个选择:
如果finally块正常完成,则try语句突然完成,原因为R。
如果finally块由于原因S而突然完成,则try语句突然完成,原因为S(并且原因R被丢弃)。
A return
statement completes abruptly,如果try
finally
return
finally
且return
也有finally
,return
1}} try
取代{{1}}。
答案 1 :(得分:1)
finally块始终作为最后执行。所以finally块中的返回OVERWRITES,其他返回try / catch块。 由于这个原因,从finally块返回或抛出异常是一种非常糟糕的做法。
与堆栈无关:它是一个事实,即finally块总是作为最后一个块执行,因此finally块中返回或抛出的内容将擦除并覆盖任何先前的退出值(返回的对象或抛出异常)。
试试这个:
try {
throw new NullPointerException();
}
finally {
return 0;
}
finally块中的return
将覆盖(吞下)NullPointerException ......
答案 2 :(得分:0)
try..catch..finally实际上是在try..catch(" any")中编译为嵌套的try..catch(你指定的例外),以及&# 34;最后"块被切断&编译器粘贴到" end"每个代码路径。 (我把"结束"用引号括起来,因为我无法记住它是如何处理来自"尝试"或" catch&#34的多个退出;阻止。)您可以使用javap命令(反汇编程序)来试验您的Java版本生成的字节代码,以对应不同的try..catch..finally组合。