try catch 中 return 详解

       只代表个的一些看法,如有不对请多多指教!         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记录的值,没有就返回继续执行自己的返回操作,但返回的值不会被改变

猜你喜欢

转载自blog.csdn.net/xuedengyong/article/details/79271605