由于线程的特性,当我们启动了线程是没有办法用try catch捕获异常的,如下例:
1 package com.xt.thinks21_2; 2 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 6 /** 7 * 线程异常捕获测试 8 * 9 * @author xue 10 * 11 */ 12 public class ThreadUncaughtExceptionTest implements Runnable { 13 14 @Override 15 public void run() { 16 // TODO Auto-generated method stub 17 throw new NullPointerException(); 18 } 19 20 public static void main(String[] args) { 21 try { 22 ExecutorService es = Executors.newCachedThreadPool(); 23 es.execute(new ThreadUncaughtExceptionTest()); 24 es.shutdown(); 25 // or this 26 // Thread t = new Thread(new ThreadUncaughtExceptionTest()); 27 // t.start(); 28 } catch (Exception e) { 29 // TODO: handle exception 30 } 31 32 } 33 }
打印异常信息为:
Exception in thread "pool-1-thread-1" java.lang.NullPointerException
at com.xt.thinks21_2.ThreadUncaughtExceptionTest.run(ThreadUncaughtExceptionTest.java:17)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
此时,我们需要为线程定制工厂类来生产线程,为线程指定UncaughtExceptionHandler
1 package com.xt.thinks21_2; 2 3 import java.lang.Thread.UncaughtExceptionHandler; 4 import java.util.concurrent.ExecutorService; 5 import java.util.concurrent.Executors; 6 import java.util.concurrent.ThreadFactory; 7 8 /** 9 * 未捕获异常执行程序 10 * 11 * @author Administrator 12 * 13 */ 14 class ThreadUncaughtExceptionHandler implements UncaughtExceptionHandler { 15 16 @Override 17 public void uncaughtException(Thread t, Throwable e) { 18 // TODO Auto-generated method stub 19 System.out.println("caught:" + e); 20 } 21 22 } 23 24 /** 25 * 线程工厂 26 * 27 * @author Administrator 28 * 29 */ 30 class HandlerThreadExceptionFactory implements ThreadFactory { 31 32 @Override 33 public Thread newThread(Runnable r) { 34 // TODO Auto-generated method stub 35 Thread t = new Thread(r); 36 t.setUncaughtExceptionHandler(new ThreadUncaughtExceptionHandler()); 37 return t; 38 } 39 40 } 41 42 /** 43 * 线程异常捕获测试 44 * 45 * @author xue 46 * 47 */ 48 public class ThreadUncaughtExceptionTest implements Runnable { 49 50 @Override 51 public void run() { 52 // TODO Auto-generated method stub 53 throw new NullPointerException(); 54 } 55 56 public static void main(String[] args) { 57 ExecutorService es = Executors 58 .newCachedThreadPool(new HandlerThreadExceptionFactory()); 59 es.execute(new ThreadUncaughtExceptionTest()); 60 es.shutdown(); 61 } 62 }
此时,我们就可以看到异常信息被捕获到了:
caught:java.lang.NullPointerException