只代表个的一些看法,如有不对请多多指教! by xue.kevin
看了好多人的解释,觉得都不太准确,其实大家都陷入了一个误区,return XXX;这句代码的意思不是说返回 XXX这个对象,而是返回 当前 XXX所指向的物理地址,如果return没有立即执行,那么无论什么时候,这个return记录的返回值是不会变的(因为java不支持对内存的操作,所以我也无法验证改变这个地址对应的值会不会使return得之改变)。这样就不难理解try catch 中的return返回的值了,在遇见return时 ,如果return没有立即执行,那么return 就已经确定了返回的物理地址,后续对XXX的操作,已经改变了XXX的指向 别的物理地址,当没有后续的return执行,那么这个返回值是不会被改变的:
另外可以去用编译出来的字节码去看,验证是不是这样的
所以只要抓住一点,return有没有立即执行;没有执行那么它指向的是谁,再结合try catch执行的顺序就可一准确的知道返回值应该是哪个
1.finally中有return,一定会执行,且结果为finally运行后的值
@SuppressWarnings("finally")
public static String testTryCatch (){
String log=null;
//测试try catch
try{
//log.length();
log="try";
return log;
}
catch(Exception e)
{
log="catch";
return log;
}
finally{
log="finally";
return log;
}
}//返回finally
2.finally 中没有return ,则finally中的只会执行,不会被返回
public static String testTryCatch (){
String log=null;
//测试try catch
try{
//log.length();
log="try";
return log;
}
catch(Exception e)
{
log="catch";
return log;
}
finally{
log="finally";
//return log;
}
}//结果为try
3 finally 中没有return ,则finally中的只会执行,不会被返回,但执行了catch
public static String testTryCatch (){
String log=null;
//测试try catch
try{
log.length();
log="try";
return log;
}
catch(Exception e)
{
log="catch";
return log;
}
finally{
log="finally";
//return log;
}
}//返回的是catch
所以总结就是
执行顺序是 try ,catch ,finally (没finally 就执行trycatch外的return)
当 try遇见return的时候,会把return的值准备好这时候return log;已经与log没有关系了,return指向的是此时log对应的对象,其后的log的值的改变时不会再指给try 中的return;
;但不会执行返回,而是看有没有finally,有finally执行,finaly有return就把finally中的结果通过finally的return返回,finally没有return 就返回到try的return执行,由于之前已经准备好了return的值,所以返回的结果不会被finally影响,catch中也是,
其实说白了,就是try和catch 和finaly中有return ,会先准备好return的值,返回的这个值已近是确定了,类似一个块级的成员变量,再去执行别的代码,别的代码中有return就返回那个return记录的值,没有就返回继续执行自己的返回操作,但返回的值不会被改变