纠正以前我对finally的错误理解

 

public static int tttt() {
	int i = 2;
	try {
		i=i/0;
		System.out.println("1:" + i);
		return i;
	} catch (Exception e) {
		i++;
		System.out.println("2:" + i);
		return i;
	} finally {
		i++;
		System.out.println("3:" + i);
	}
}

 

public static void main(String[] args) {
	System.out.println("4:" + tttt());
}

 

代码如上,会打印些什么呢?

最初玩按照以前的理解:finally在什么情况下都会执行,而执行return语句之后函数就会中断。所以我认为finally会在return之前执行。所以结果应该是:

 

2:3
3:4
4:4

 

 但是执行的结果却是:

 

2:3
3:4
4:3

 

 

怎么回事呢?跟踪执行顺序,我们会发现当遇到异常的时候会跳转到catch块里面,并且会在这里执行return,然后才会执行finally块。并且返回值不会被修改了。我修改i = i/0为i = i/1,也会得出近似的结果。

也就是说finally是在return之后被执行的。

在朋友的强调下仔细看官方的Java tutorial,发现也有执行try或者catch块而不执行finally块。这种情况是在执行try或者catch遇到了退出JVM操作或者退出线程操作。

 

最后的总结是:finally块是防止资源泄漏的重要工具,将关闭(释放)或者恢复文件或者其他资源的代码放到finally块中,可以保证这些资源被关闭(翻译的)。同时我认为:在finally块中,只适合做关闭(释放)或者恢复资源的操作,其他操作请尽量不要放到这个地方

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值