try、catch、finally中return的问题
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。