我们知道finally块的代码在进入异常处理体系后,里面的代码一定会被执行(除非调用System.exit(0)强制退出程序),那么如果try{}里面有一个return语句,那么紧随其后的finally{}代码会被执行不?reutrn 需要注意些什么呢。
先看例子
package exceptionTest;
public class 覆盖return {
//测试return 基本类型
public static int finallytest() {
int r=1;
try {
r=3;
return r;
} catch (Exception e) {
return 0;
// TODO: handle exception
}finally{
r=5;
System.out.println("直接变量");
}
}
//测试return 引用类型
public static StringBuffer ftest(){
StringBuffer sb=new StringBuffer("Hello");
try {
sb.append("gsg");
return sb;
} catch (Exception e) {
return null;
// TODO: handle exception
}finally{
sb.append(" world");
System.out.println("引用变量");
}
}
public static void main(String[] args) {
int zj =finallytest();
System.out.println(zj);
System.out.println(ftest());
}
}
输出为:
直接变量
3
引用变量
Hellogsg world
由此可得:
1.return的是常量
finally块会改变return的值2.return 的是变量
若是基本类型的数据,在finally块改变return的变量的值 没有任何影响
而引用类型会有改变,因为方法内部定义的变量存储在栈中,当这个函数结束后,
对应的栈会被回收,其变量自然不复存在了,所有return的值不是返回变量的值,而是复制一份再返回。