直接看代码:
代码一:
public class Test {
public static void main(String[] args) {
System.out.println(new Test().test());
}
static int test() {
int x = 1;
try {
return x;
} finally {
++x;
}
}
}
结果:
1
这说明了什么问题?
finally块里面的代码总是在try块return之后执行?我们将代码稍作修改
代码二:
public class Test {
public static void main(String[] args) {
System.out.println(new Test().test());
}
static int test() {
int x = 1;
try {
return x;
} finally {
System.out.println("finally 块执行了...");
}
}
}
结果:
finally 块执行了...
1
此时finally块好像又是在return之前执行的,我们继续修改代码
代码三:
public class Test {
public static void main(String[] args) {
System.out.println(new Test().test());
}
static int test() {
int x = 1;
try {
return x;
} finally {
++x;
return x;
}
}
}
结果:
2
发现此时返回的是2!!!,那么finally块中的代码到底是在return之前执行呢还是在之后和执行呢?其实两者都不是,
确切的说应该在return返回中执行,可以这样理解,在try块中的代码return之后,会将return的值存储到数据栈中,此时
并未完全返回,然后去执行finally块,在代码一中,执行finally快的时候,数据栈中已经存储了return的值为1,即使
++x也不能改变返回值了,而代码二中,尽管数据栈中已经存储了return的值为1,但是在执行finally块的时候又return了一次,
直接覆盖了数据栈中的1变为了++x,即2。
因此做以总结,finally块是在try块还未完全return的时候执行的!!执行完finally块之后才会完全返回。
转载于:https://blog.51cto.com/12222886/2068559