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()