大家平时写线程很多,但可能很少关注如何捕获线程的全局异常。其实jdk提供了两种捕获全局异常的方法,一种是基于整个线程类(staticsetDefaultUnaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)),一种基于线程的一个对象(setUncaughtExceptionHandler(Thread.UncaughtExceptionHander eh))。
下面是基于线程的一个对象的示例:
/** * 主线程 */ public class MainThread extends Thread implements Thread.UncaughtExceptionHandler { public static void main(String[] args){ new MainThread().start(); } public void run(){ ChildThread child=new ChildThread(); child.setUncaughtExceptionHandler(this); child.start(); } /** * 获得子线程异常 * @param t * @param e */ @Override public void uncaughtException(Thread t, Throwable e) { System.out.println("以下为子线程异常:"); e.printStackTrace(); } }
/** * 子线程 */ public class ChildThread extends Thread{ public void run(){ int a=Integer.parseInt("sdfdf"); } }
执行主线程的main方法启动子线程,此时主线程uncaughtException会捕获子线程的异常,执行结果如下:
以下为子线程异常:
java.lang.NumberFormatException: For input string: "sdfdf"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at net.hsh.util.ChildThread.run(ChildThread.java:9)