不执行finally代码的原因以及总结
通常来说,在try 和catch 代码块执行后,无论是否抛出异常,finally代码都会执行。
但遇到以下几种情况时,finally代码将不被执行:
1、调用 System.exit 函数
System.exit()的作用是中止当前虚拟机,如果虚拟机被中止,那么finally代码块就不会执行。
try {
System.out.println(" P1");
System.exit(1);
} finally {
System.out.println("P2");
}
执行结果:
P1
2、守护线程被中止
原理:
java线程分为两类,守护线程和非守护线程。当所有的非守护线程中止时,不论存不存在守护线程,虚拟机都会杀死守护线程从而中止程序。
在java虚拟机中,执行main方法的线程就是一个非守护线程,垃圾回收则是另一个守护线程,main执行完,程序就中止了,而不管垃圾回收线程是否中止。 所以,如果守护线程中存在finally代码块,那么当所有的非守护线程中止时,守护线程被杀死,其finally代码块是不会执行的。
Runnable runnable = () -> {
try {
System.out.println("P1");
} finally {
try {
Thread.sleep(1000);
System.out.println("P2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread regular = new Thread(runnable);
Thread daemon = new Thread(runnable);
daemon.setDaemon(true);
regular.start();
Thread.sleep(300);
daemon.start();
执行结果:
P1
P1
P2
3、未执行到finally代码块
1、当程序直接返回,并且没有返回到 try catch语句中
2、 当try catch语句中存在无限循环的代码
try {
System.out.println("P1");
while (true) {
}
} finally {
System.out.println("P2");
}