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块中,只适合做关闭(释放)或者恢复资源的操作,其他操作请尽量不要放到这个地方