未捕获异常
由于线程的特性,不能捕获重线程中逃逸的异常。线程中出现异常会被抛到控制台,除非采取特殊的步骤捕获这种异常。
Thread.UncaughtExceptionHandler.uncaughtExcepton()
uncaughtException()可以捕获未捕获的异常。当线程中没有发现uncaughtException()方法时,才会调用defaultUncaughtExceptionHandler。
专有uncaughtException()方法
package com.zachary.uncaught.exception;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
/**
* @author Zachary.Zheng
* @version 1.0
* @date 2020年4月25日 下午3:12:11
*/
public class CaptureUncaughtException {
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool(new HandlerThreadFactory());
executor.execute(new ExceptionThread2());
executor.shutdown();
}
}
class ExceptionThread2 implements Runnable {
@Override
public void run() {
Thread t = Thread.currentThread();
System.out.println("run by " + t);
System.out.println("eh " + t.getUncaughtExceptionHandler());
System.out.println("default eh " + t.getDefaultUncaughtExceptionHandler());
throw new RuntimeException();
}
}
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("caught " + e);
}
}
class HandlerThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
System.out.println(this + "create new Thread");
Thread t = new Thread(r);
t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
System.out.println("eh " + t.getUncaughtExceptionHandler());
return t;
}
}
默认未捕获异常出理器 defaultUncaughtExceptionHandler
package com.zachary.uncaught.exception;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author Zachary.Zheng
* @version 1.0
* @date 2020年4月25日 下午4:13:08
*/
public class SettingDefaultHandler {
public static void main(String[] args) {
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(new ExceptionThread2());
}
}