码迷,mamicode.com
首页 > 编程语言 > 详细

【转】Java中finally的执行时机

时间:2014-12-14 17:01:30      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   os   sp   java   on   art   

 

原文链接 http://blog.csdn.net/imzoer/article/details/8037970

 

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

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

看代码:

bubuko.com,布布扣

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

再看下面代码:

bubuko.com,布布扣

奇怪的是,上面的代码输出的竟然是2。 原因还是稍微深奥的。

解释下: 这里面,涉及到一个栈帧的问题。 在catch中执行的时候,return之前是需要去执行finally的。

执行finally之前,把当前要返回的值的引用保存到一个slot【槽】中,也就是说return已经执行,

但是还没返回(在MyEclipse的debug模式下可以看的很清楚),把当前要返回的值保存起来了。

 然后执行finally,执行完finally,再从slot中取出要返回的值进行返回。

 

如果返回的是一个对象的引用的话,那么将是finally执行后的值。如果是一个基本类型的话,

那么返回的就只是那个基本类型的值了。 【在这里需要注意一点的是,当返回值是对象,

而不是普通的java基本类型的时候,在finally中的修改会反映到返回值中(第一个例子),

但是如果是普通的java基本类型,那么finally中的修改就不会反映到返回值中了,

表现出来就是,finally虽然修改了,但是返回值仍然是2,见上面的代码(第二个例子)】。

修改会反映到返回值中,是因为存储在slot中的是对象的引用。

在finally中修改的时候,修改的内容已经保存到堆中的对象了。

此时return,会反映出修改后的结果。

 

【转】Java中finally的执行时机

标签:style   blog   http   ar   os   sp   java   on   art   

原文地址:http://www.cnblogs.com/ihongyan/p/4162669.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!