`

关于return和finally的执行时机的一点小问题

阅读更多

国庆几天,闲的蛋疼,于是便找了一些以前学过的东西来敲,随后发现了一个小问题。

由于代码教简单,先现出代码:

package cn.lzj0927_cvte_question;
/**
 * return  的用途:导致当前方法的退出,并返回那个值
 * finally :无论异常是否被抛出,finally子句总能被执行
 */
public class TestTryFinally {

	public static void main(String[] args) {
		System.out.println(test());
	}

	public static int test(){
		int x =99;
		try{
			System.out.println("try"+x);
			return x;
		}
		finally{
			System.out.println("finally"+x);
			x=8;
			System.out.println("finally"+x);
		}
	} 
}

  运行结果如下:

try99

finally99

finally8

99

可以看见,在finally中x的值已被改变,可是输出的竟然是x改变之前的值。

test的执行顺序如下:

若try{}子句中有return,那么执行到return时,先不返回,先执行fianlly子句,再返回值。

仔细分析,可以发现,fianlly中改变的只是x在栈中的值,在返回时,变量指向的值并没有被改变。把test代码稍作修改:

public static int test2(){
		int x =99;
		int y =0;
		try{
			System.out.println("try"+x);
			return x;
		}
		finally{
			System.out.println("finally"+x);
			x=y;
			return x;
		}
	} 

 main中输出的便是y的值:0

可推测,在try中执行到return时,先把要返回的引用存到了某一地方,但未返回,当执行完finally时,便调用引用,返回引用所指向的堆中所存的值。因此,在finally中对基本数据类型变量的值的改变对返回值并没有影响,而对对象引用的改变就会对返回值有所影响。

后来我在finally中也加了一个return,输出的是x改变之后的值。可知finally中的return会覆盖try中的return,也就是说,若finally中有return,将直接返回,不会再执行try中的return。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics