try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,是在return前还是后

一般答案:会执行,在方法返回调用前执行。准确的说是在return中间执行。

下面举个例子:

public class Test {
	    public static void main(String[] args) {
	        System.out.println("结果: " + new Test().test());
	    }
	    
	    static int test(){
	        int i = 1;
	        try {
	            System.out.println("try里面的i : " + i);
	            return i;
	        }finally{
	            System.out.println("进入finally...");
	            ++i;
	            System.out.println("fianlly里面的i : " + i);
	            //return i;
	        }
	    }
}
结果是:try里面的i : 1
               进入finally...
               fianlly里面的i : 2
              结果: 1

结果是1,并不是大家想象的结2。相关解释如下:



上面我认为比较靠谱的一种解释。

还有一种解释为:

主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。
楼主是从现象级别分析的,我觉得百度知道那个答案说的不够彻底和核心。
从C#(我是C#) 局部变量和函数返回值的存储方式来理解,

他们都存储在堆栈(一种先进后出的结构)上,在上述函数返回的时候,会将返回值压入堆栈栈顶,相当于堆栈中现在有两个相同的值,而finally 使用的是之前的局部变量的值,所以finally操作不会对 返回值产生影响。

说到这里,如果原局部变量是一个引用类型,在try 中叶返回引用,那么堆栈中会有两个引用,但是实际指向同一个对象,这时候在finally正对该局部变量操作会对原对象产生影响。
 
如果我在finally里最后加上一句return i;那么最后的结果是2,因为上面说用栈保存的值,那这个结果我可不可以理解为:因为栈是先进后出的结构嘛,所以当2压入栈中的时候是在栈顶,所以输出的是栈顶的值也就是2.

最终总结:return语句会先压入栈里面,最后执行finally语句(有return语句,值压入栈中),最后弹出栈顶元素。

转自:http://blog.sina.com.cn/s/blog_4cef5c7b0102wf9m.html
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值