首页 移动开发 在线交易 IT笔记 网络技术 操作系统 企业架构 数据库 考试认证 IT培训 开源软件 数据存储 行业资讯
大家都在看:java   开发   C#   oracle   mysql   android   web开发   学习   sqlserver   linux   asp   php   ajax   javascript   css   html
java中Finally块的执行
2014-11-17 09:50:08 来源: 作者:admin 栏目:Java学习 责任编辑:
[导读] 在try{}catch{}finally{}块中,都知道finally子块是肯定会执行的。当然也有个别情况,当在try{}或者catch{}块中出现强制退出System.exti(int)时,finally子块就不会执行了。这种情况不在今天的谈论范围以内。看代码更加直观些:package practice;public class Fi..
在try{}catch{}finally{}块中,都知道finally子块是肯定会执行的。当然也有个别情况,当在try{}或者catch{}块中出现强制退出System.exti(int)时,finally子块就不会执行了。这种情况不在今天的谈论范围以内。
看代码更加直观些:
package practice;public class FinallyRun {	private int a = 0;	public int getInt() {		try {			a = 1;			return a;		} finally {			a = 2;//			return a;		}	}	public static void main(String[] args) {		FinallyRun f = new FinallyRun();		int tmp = f.getInt();		System.out.println("f.getInt() = " + tmp);		System.out.println("f.a = " + f.a);	}}

我在a=1出打了断点,单步跟踪发现:尽管try中包含return,并且try中的return语句执行完,程序就会跳到finally中,继续跑下去,然后返回退出getInt()方法。结果如下:
f.getInt() = 1f.a = 2

从结果中可以看出,getInt()方法返回值的1,而变量a的值为2。把代码中的注释取消,运行程序结果如下:
f.getInt() = 2f.a = 2

这次变量a的值和方法返回值都为2。
在此多谢@abc08010051指出错误,让我离真相又进了一步。
在try{}中return执行后(但是return子句还没执行完),会把return流中的变量缓存并保留一份副本,这个副本对于finally子块是不可见的。接着进入finally子块中,虽然finally中修改了变量a的值,但是没有影响到副本的值。如果finally中没有return、break或者continue和异常,那么方法就会从try中退出,并返回缓存中的变量值;如果finally中也有return语句,那么finally子块中的return流就会覆盖之前try{}中的return流,修改缓存中的变量值,返回被修改的值,然后方法退出。

如有不对,敬请指正。
标签:
本站地址:/
版权所有:转载请注明出处!
分享到:
上一篇java网站后台实现--ServLet 下一篇JSTL 实现分页功能
您可能还喜欢
暂无...
今日最新资讯 最新推荐信息
考试认证 更多
开发技术 更多
移动开发 更多

关于 | 合作伙伴 | 联系我们 | 友情链接 | 版权声明 | 网站制作 | 网站地图 | 加入收藏 | 设为首页

Copyright@2012-2016 京ICP备12027873号