一 .概述
我们知道一个线程运行之后,它会另外开启一个线程栈来完成自己的任务的运行,此时异常的捕获就是一个问题.
二 .异常的演示
public static void main(String[] args) { try { new Thread(new Runnable() { @Override public void run() { throw new RuntimeException(); } }).start(); } catch (Exception e) { e.printStackTrace(); } }
我们运行上述的程序,结果如下:
Exception in thread "Thread-0" java.lang.RuntimeException at com.trek.concurrency.exception.ExceptionTest$1.run(ExceptionTest.java:10) at java.lang.Thread.run(Thread.java:745)
我们发现我们根本无法捕获线程抛出的异常,仅仅就是打印了一个线程的堆栈信息.
三 . 使用线程异常处理器完成任务
public class ExceptionHandler { static class Handler implements UncaughtExceptionHandler{ @Override public void uncaughtException(Thread t, Throwable e) { //在此处我们只需要打印一下信息就好了 System.out.println("线程的名字: "+t.getName()); System.out.println(e); } } public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { throw new RuntimeException("我抛出了一个异常信息"); } }); thread.setUncaughtExceptionHandler(new Handler()); thread.start(); } }
首先,我们定义了一个内部类为异常处理器.
然后我们在创建线程的时候绑定一个异常处理器对象的实例.
当我们的线程抛出一个异常的时候,异常处理器就会捕获这个异常.
我们查看结果:
线程的名字: Thread-0 java.lang.RuntimeException: 我抛出了一个异常信息
我们发现线程抛出的异常信息我们可以捕获到了.
原文地址:https://www.cnblogs.com/trekxu/p/8995738.html
时间: 2024-10-13 23:39:46