关于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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值