异常处理中的return问题
异常处理中的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块内打开的资源进行回收。