1. 问题描述
try、finally问题描述为:如果一个程序段中存在try、catch、finally代码块,其中try代码块中存在return语句,请问finally代码块中的语句还会执行吗?如果会,是在return前,还是return后。
2.问题讨论
最初看到这个问题是在论坛里面看到的,楼主的观点认为finally在return语句之后执行,给出示例代码如下:
package com.edu.philosopher;
public class TryCatchProblem {
public static void main(String[] args) {
System.out.println(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
return b = 88;
} catch (Exception e) {
System.out.println("error : " + e);
} finally {
if (b > 25) {
System.out.println("b>25 : " + b);
}
System.out.println("finally");
}
System.out.println("test");
return b = 100;
}
}
得到运行结果如下:
此时b值已经变成88,说明return语句已经执行了。后面有人就提出质疑,函数是存放在栈中,return执行后会退回到上一个栈中,就无法准确找到finally语句的地址了。我觉得说的很有道理,最大的问题在于代码中的return语句其实可以拆分成两句,即:b=88和return b;也就是说函数运行到这里只是完成了赋值,并没有return。在debug环境下很容易看出先后顺序。
3.问题进阶
如果try和finally中都有return语句,那么返回的是哪一个值,测试程序如下:
package com.edu.philosopher;
public class TryCatchProblem {
public static void main(String[] args) {
System.out.println(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b = 88;
return b;
} catch (Exception e) {
System.out.println("error : " + e);
} finally {
System.out.println(b);
b = 90;
if(b > 25){
System.out.println("b>25 : "+b);
}
System.out.println("finally");
return b;
}
}
}
最终测试结果如下:
很显然是finally中的return语句发挥了作用,在debug模式下查看也是finally代码块中return了b值。
4.参考链接
一家之言,欢迎拍砖