import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
class ExceptionThread2 implements Runnable {
@Override
public void run() {
Thread t =Thread.currentThread();
System.out.println("run by" + t);
System.out.println("eh = " + t.getUncaughtExceptionHandler());
throw new RuntimeException();
}
}
class MyUncaughtExeceptionHandler implements Thread.UncaughtExceptionHandler{
@Override
public void uncaughtException(Thread arg0, Throwable e) {
System.out.println("caught " +e);
}
}
//class HandlerThreadFactory implements ThreadFactory{
//
//@Override
//public Thread newThread(Runnable r) {
//System.out.println(this +"creating new Thread");
//Thread t =new Thread(r);
//System.out.println("created " + t);
//t.setUncaughtExceptionHandler(new MyUncaughtExeceptionHandler());
//System.out.println("eh =" + t.getUncaughtExceptionHandler());
//return t;
//}
//
//}
public class CaptureUncaughtException{
public static void main(String[] args){
ExecutorService exec= Executors.newCachedThreadPool();
Thread t =new Thread(new ExceptionThread2());
System.out.println("created " + t);
t.setUncaughtExceptionHandler(new MyUncaughtExeceptionHandler());
System.out.println("eh =" + t.getUncaughtExceptionHandler());
exec.execute(t);
}
}
上面这段代码为什么捕获不了,裘高手解答。
另外一种方法通过ThreadGroup 捕获
public class ApplicationLoader extends ThreadGroup
{
private ApplicationLoader()
{
super("ApplicationLoader");
}
public static void main(String[] args)
{
Runnable appStarter = new Runnable()
{
public void run()
{
//invoke your application (i.e.MySystem.main(args)
throw new NullPointerException(); //example, throw a runtime exception
}
};
new Thread(new ApplicationLoader(), appStarter).start();
}
//We overload this method from our parent
//ThreadGroup , which will make sure that it
//gets called when it needs to be. This is
//where the magic occurs.
public void uncaughtException(Thread thread, Throwable exception)
{
//Handle the error/exception.
//Typical operations might be displaying a
//useful dialog, writing to an event log, etc.
exception.printStackTrace();//example, print stack trace
}
}