Java中,finally与return执行问题

finally是在catch执行之后return之前执行的。

那么,如果在finally中改变了catch中要返回的对象,那么,返回值改变了吗?

看代码:

上面代码输出是3,说明finally中的改变对catch中的返回值产生了影响。

再看下面代码:

奇怪的是,上面的代码输出的竟然是2。
原因还是稍微深奥的。
解释下:
这里面,涉及到一个栈帧的问题。
在catch中执行的时候,return之前是需要去执行finally的。执行finally之前,把当前要返回的值的引用保存到一个slot【槽】中,也就是说return已经执行,但是还没返回(在MyEclipse的debug模式下可以看的很清楚),把当前要返回的值保存起来了。然后执行finally,执行完finally,再从slot中取出要返回的值进行返回。如果返回的是一个对象的引用的话,那么将是finally执行后的值。如果是一个基本类型的话,那么返回的就只是那个基本类型的值了。
【在这里需要注意一点的是,当返回值是对象,而不是普通的Java基本类型的时候,在finally中的修改会反映到返回值中(第一个例子),但是如果是普通的java基本类型,那么finally中的修改就不会反映到返回值中了,表现出来就是,finally虽然修改了,但是返回值仍然是2,见上面的代码(第二个例子)】。
修改会反映到返回值中,是因为存储在slot中的是对象的引用。在finally中修改的时候,修改的内容已经保存到堆中的对象了。此时return,会反映出修改后的结果。

==============》《================

这里把为什么是引用类型的时候返回值能反映修改说的比较清楚了。但是是基本类型的时候却没怎么说的明白。后续再研究研究。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值