异常处理中的return问题
先上结论:try中return语句是先于finally块的执行的。
首先我们在try中添加return语句,然后在finally中对return的值进行修改。
public class Test {
public static void main(String[] args) {
System.out.println("函数返回结果 " + test());
}
public static int test(){
int x = 999;
try {
System.out.println("try块内的x " + x);
return x;
} finally {
System.out.println("finally块:");
++x;
System.out.println("finally块内的x " + x);
}
}
}
运行结果:
从结果顺序可以看出,在执行try中的语句时,当执行到return时,程序会将将要返回的结果暂时存储在该方法栈帧的局部变量中,然后执行finally语句,当程序运行完finally块后,才返回到return代码,将之前存储的返回值取出输出。
因此,finally中对x的改变,不会影响返回结果。
而当我们在finally中添加return语句时
public class Test {
public static void main(String[] args) {
System.out.println("函数返回结果 " + test());
}
public static int test(){
int x = 999;
try {
System.out.println("try块内的x " + x);
return x;
} finally {
System.out.println("finally块:");
++x;
System.out.println("finally块内的x " + x);
return x;
}
}
}
执行结果为
由此可见,try中return语句确实是先于finally块的执行的。
不过一般不建议在finally中写return语句,finally块存在的主要目的还是对try块内打开的资源进行回收。