使用UncaughtExceptionHandler的原因
- 主线程可以轻松发现异常,子线程不能
- 子线程的异常无法用传统方式捕获
- 在捕获到异常时也能进行处理,提高健壮性
全局异常处理使用方式
-
实现
Thread.UncaughtExceptionHandler
接口public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { private String name; public MyUncaughtExceptionHandler(String name) { this.name = name; } @Override public void uncaughtException(Thread t, Throwable e) { Logger logger = Logger.getAnonymousLogger(); logger.log(Level.WARNING, "线程异常,终止啦" + t.getName()); System.out.println(name + "捕获了异常" + t.getName() + "异常"); } }
-
在可能出现异常的程序中使用
public class UseOwnUncaughtExceptionHandler implements Runnable { public static void main(String[] args) throws InterruptedException { MyUncaughtExceptionHandler handler = new MyUncaughtExceptionHandler("捕获器1"); Thread.setDefaultUncaughtExceptionHandler(handler); new Thread(new UseOwnUncaughtExceptionHandler(), "MyThread-1").start(); Thread.sleep(300); new Thread(new UseOwnUncaughtExceptionHandler(), "MyThread-2").start(); Thread.sleep(300); new Thread(new UseOwnUncaughtExceptionHandler(), "MyThread-3").start(); Thread.sleep(300); new Thread(new UseOwnUncaughtExceptionHandler(), "MyThread-4").start(); } @Override public void run() { throw new RuntimeException(); } } --------------------------------------------------------------- 一月 06, 2021 8:26:40 下午 threadcoreknowledge.uncaughtexception.MyUncaughtExceptionHandler uncaughtException 警告: 线程异常,终止啦MyThread-1 捕获器1捕获了异常MyThread-1异常 一月 06, 2021 8:26:41 下午 threadcoreknowledge.uncaughtexception.MyUncaughtExceptionHandler uncaughtException 警告: 线程异常,终止啦MyThread-2 捕获器1捕获了异常MyThread-2异常 捕获器1捕获了异常MyThread-3异常 一月 06, 2021 8:26:41 下午 threadcoreknowledge.uncaughtexception.MyUncaughtExceptionHandler uncaughtException 警告: 线程异常,终止啦MyThread-3 一月 06, 2021 8:26:41 下午 threadcoreknowledge.uncaughtexception.MyUncaughtExceptionHandler uncaughtException 警告: 线程异常,终止啦MyThread-4 捕获器1捕获了异常MyThread-4异常