注:无论 try 子句中执行了
return、break 还是 continue 语句,或是程序出现异常,finally 子句块都会被执行
。除非直接调用System.exit()
来终止程序。
来看这样一段有意思的代码~
java
public class Demo_try_catch_finally {
public static int get(){
int x = 1;
try{
x = 2;
return x;
}catch (Exception e){
x = 3;
return x;
}finally {
x = 4;
}
}
public static void main(String[] args) {
System.out.println(get());
}
}
它的返回结果是多少呢?4?3?2?1?总之,总会有一个是对的!
咱们来 debug 一下,你会发现第一次执行的是 x=2,return x;
这里没有问题,我们按F7
查看程序执行的下一步。
程序并没有跟我们想象的那样,执行return语句后,直接返回。如下图所示,它直接去执行finally中的代码。
执行完finally中的代码后,你会发现debug又回到了try代码块中,并且这时候x是等于4的。感觉没毛病了,大家肯定都会觉得返回结果一定是4没错了,收工~
看看控制台,直接裂开!!!居然是2!!!
为什么程序的返回结果是2而不是4呢?
来看看官方的JVM规范是如何解释的:
翻译成中文大概意思如下:
若try子句执行return语句,编译后的代码将执行以下操作:
- 将返回值保存到局部变量中;
- 执行jsr指令转移到执行finally子句;
- 执行完finally子句返回时,返回保存在局部变量中的值。