try、catch、finally中return的问题
一、try中有return,finally有return
public int test(){
int i =0;
try{
i = 2;
return i;
}catch(Exception e){
System.out.println(e);
}finally{
i = 3;
return i;// i=3
}
}
返回值为3
理由:
try执行遇到return时,会将此时的返回值
i
保存在局部变量表finally执行遇到对
i
的操作会继续对i进行操作,即:修改了i
二、try中有return,finally没有return
此时分为两种情况,可以理解为值类型和引用类型传参的区别
- 返回值为基本类型(不变)
- 返回值为引用类型(会改变)
// 返回类型为基本类型时
public int test(){
int i =0;
try{
i = 2;
return i;// 不执行返回,暂存返回值
}catch(Exception e){
// **
}finally{
i = 3;
}
return i;// i=2
}
//
public StringBuffer test2(){
StringBuffer sb = new StringBuffer();
try{
sb.append("a");
return sb;// 不执行返回,暂存返回值
}catch(Exception e){
// **
}finally{
sb.append("b");
}
return sb;// sb = "ab"
}
总结
1、finally中的代码总会被执行。
2、当try、catch中有return时,也会执行finally。return的时候,要注意返回值的类型,是否受到finally中代码的影响。
3、finally中有return时,会直接在finally中退出,导致try、catch中的return失效。
4、当finally中没有return时,需要在try/catch语句外显式return。