`
gcgan
  • 浏览: 37246 次
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

 

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics