JVM爲我們提供了線程的未捕獲異常處理機制,通過Thread
的setUncaughtExceptionHandler(UncaughtExceptionHandler)
方法
public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh)
也可以通過靜態方法setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler)
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh)
CrashCaught
類,可以設置未捕捉異常處理機制,併發出未處理異常
public class CrashCaught extends Thread {
private boolean caught;
public CrashCaught(boolean caught) {
this.caught = caught;
}
@Override
public void run() {
System.out.println(getName());
if (caught) {
setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
throw new NullPointerException();
}
}
MyUncaughtExceptionHandler
類捕捉未處理異常
static class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
String name;
public MyUncaughtExceptionHandler() {
this.name = Thread.currentThread().getName();
}
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("In Handler " + name);
System.out.println("Thread name " + t.getName());
e.printStackTrace();
}
}
main()
方法設置默認UncaughtExceptionHandler
public static void main(String[] args) {
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
new CrashCaught(false).start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
new CrashCaught(true).start();
}
如果設置了setDefaultUncaughtExceptionHandler()
,會捕捉所有未處理異常,除非該線程已經設置了setUncaughtExceptionHandler()