在finally中的语句一般都会得到执行,即使在try语句块内含有return(注:finally语句中含有return语句会影响异常的正常抛出)。而在以下情况中,finally中的语句将不会得到正常执行:
1. 程序执行过程中发生掉电。常见于嵌入式产品中。
2. 当主程序结束导致后台程序(daemon)强制结束时,后台程序(daemon)中的finally语句块有可能无法正常执行,例:
package com.naruto.chapter21;
import java.util.concurrent.*;
public class DaemonDontRunFinally {
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t = new Thread(new ADaemon());
t.setDaemon(true);
t.start();
}
}
class ADaemon implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println("Starting ADaemon");
TimeUnit.SECONDS.sleep(1);
}catch(InterruptedException e) {
System.out.println("Exiting via InterrruptedException");
}finally {
System.out.println("This should always run?");
}
}
}
输出:
Starting ADaemon
一旦main()函数执行完毕退出,JVM就会立即关闭所有的后台程序(Daemon)。