finally 会耍你
什么,在 finally 里修改变量,竟然对结果没影响?
我们来看看代码,是怎么回事(可以先在心里运行一下)
public class TryTest {
private static int test() {
int x = 1;
try {
System.out.println("A");
return ++x;
} catch (Exception e) {
System.out.println("D");
} finally {
System.out.println("B");
++x;
}
System.out.println("C");
return x;
}
public static void main(String[] args) {
int result = test();
System.out.println(result);
}
}
A B 2
开始 debug
(1) 首先执行 try 中的语句,此时 x = 1
(2)然后执行 return ++x;此时x = 1
(3)由于没有抛出异常,此时不执行catch语句,继续执行 finally 的语句
(4)继续执行
(5)继续执行,会发现,再次回到 try {...} 中的代码,停留在 return ++x;
(6)再继续执行,就已经返回了,但返回值是 2,不是刚刚的3
System.out.println("B"); return x;
这两句压根就没有执行,返回值也不是我们预期的3,WF ?
这是怎么回事?
去查阅了一下官方资料,官方给出的解释是:
如果 try 语句里有 return,那么代码的行为如下:
然后再根据以上的 debug 调试以及解释说明就可以知道返回 x 为什么是 2 了
当执行到 return ++x 时,jvm 在执行完 ++x 后,会在局部变量表里另外分配一个空间来保存当前的 x 值。
注意,现在还没有把返回值给 result,而是继续执行 finally 语句里语句。
等执行完后再把之前保存的值(是2,不是3)返回给 result。
总结一下
什么情况下 finally 不会被执行