finally语句不会执行的情况:
(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。
finally语句示例说明:
- 测试try语句块
清单 3:
public class Test {
public static void main(String[] args) {
try {
System.out.println("try block");
return ;
} finally {
System.out.println("finally block");
}
}
}
清单 3 的执行结果为:
try block
finally block
清单 3 说明 finally 语句块在 try 语句块中的 return 语句之前执行。
2. 测试catch语句块
我们再来看另一个例子(清单 4)。
清单 4.
public class Test {
public static void main(String[] args) {
System.out.println("reture value of test() : " + test());
}
public static int test(){
int i = 1;
try {
System.out.println("try block");
i = 1 / 0;
return 1;
}catch (Exception e){
System.out.println("exception block");
return 2;
}finally {
System.out.println("finally block");
}
}
}
清单 4 的执行结果为:
try block
exception block
finally block
reture value of test() : 2
清单 4 说明了 finally 语句块在 catch 语句块中的 return 语句之前执行。
结论
从上面的清单 3 和清单 4,我们可以看出,其实 finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。
本文参考两篇前辈们的文章:
1. http://www.cnblogs.com/lanxuezaipiao/p/3440471.html
2. https://www.ibm.com/developerworks/cn/java/j-lo-finally/