当代码没有进行到与finally配套的try/catch语句中时。
1.在执行try块之前直接return,发现finally块是不会执行的
public class TryCatchTest {
private static int total() {
int i = 11;
if (i == 11) {
return i;
}
try {
System.out.println("执行try");
} finally {
System.out.println("执行finally");
}
return 0;
}
public static void main(String[] args) {
System.out.println("执行main:" + total());
}
}
输出结果:
执行main:11
2.在执行try块之前制造一个错误,发现finally块是不会执行的
private static int total() {
return 1 / 0;
try {
System.out.println("执行try");
} finally {
System.out.println("执行finally");
}
return 0;
}
public static void main(String[] args) {
System.out.println("执行main:" + total());
}
}
当代码进入到与finally配套的try/catch语句中。
1.写入代码:System.exit(0),它表示退出当前Java虚拟机,一旦退出Java虚拟机,任何代码都不会再执行。
2.线程被终止或打断:如果当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了。
3.当线程为守护线程时,如果主线程死亡了,finally也不会执行的。