Java异常处理UncaughtExceptionHandler使用实例代码详解

 更新时间:2023年03月01日 09:38:18   作者:健鑫.  
当一个线程由于未捕获异常即将终止时,Java虚拟机将使用thread . getuncaughtexceptionhandler()查询线程的uncaughtException处理程序,并调用处理程序的uncaughtException方法,将线程和异常作为参数传递

异常处理

线程未捕获异常 UncaughtException 需要UncaughtZExceptionHandler 来进行处理

那么为什么非要用UncaughtZExceptionHandler呢?

  • 主线程可以轻松捕获线程,子线程不可以
  • 从下面代码可知,即使子线程抛出异常,主线程丝毫不受影响
public class ChildException implements Runnable{
    public static void main(String[] args) {
        new Thread(new ChildException()).start();
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }
    }
    @Override
    public void run() {
        throw new RuntimeException();
    }
}
/*
* Exception in thread "Thread-0" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.ChildException.run(ChildException.java:14)
   at java.lang.Thread.run(Thread.java:748)
0
1
2
3
4
5
6
7
8
9
* */
  • 从下面代码可知,即使想用catch捕获子线程异常,时没有用的
  • try catch 是针对主线程的,没有办法捕获子线程的异常
public class CantCatch implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        try {
            new Thread(new CantCatch(), "thread0").start();
            Thread.sleep(300);
            new Thread(new CantCatch(), "thread1").start();
            Thread.sleep(300);
            new Thread(new CantCatch(), "thread2").start();
            Thread.sleep(300);
            new Thread(new CantCatch(), "thread3").start();
            Thread.sleep(300);
        } catch (RuntimeException e) {
            System.out.println("catch");
        }
    }
    @Override
    public void run() {
        throw new RuntimeException();
    }
}
/*
* Exception in thread "thread0" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Exception in thread "thread1" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Exception in thread "thread2" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Exception in thread "thread3" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Process finished with exit code 0
* */

在run方法中进行try catch可以捕获到异常,但是特别麻烦,因为需要手动地在每个run方法中都进行try catch

UncaughtExceptionHandler

自定义UncaughtExceptionHandler

public class MyUncaughtHandler implements Thread.UncaughtExceptionHandler{
    private String name;
    public MyUncaughtHandler(String name) {
        this.name = name;
    }
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        Logger logger = Logger.getAnonymousLogger();
        logger.log(Level.WARNING, "线程异常" + t.getName(), e);
        System.out.println(name + "捕获" + t.getName()+ e);
    }
}

使用自定义的类来捕获异常

public class UseOwnExceptionHandler implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtHandler("MyHandler"));
//        try {
        new Thread(new UseOwnExceptionHandler(), "thread0").start();
        Thread.sleep(300);
        new Thread(new UseOwnExceptionHandler(), "thread1").start();
        Thread.sleep(300);
        new Thread(new UseOwnExceptionHandler(), "thread2").start();
        Thread.sleep(300);
        new Thread(new UseOwnExceptionHandler(), "thread3").start();
        Thread.sleep(300);
//        } catch (RuntimeException e) {
//            System.out.println("catch");
//        }
    }
    @Override
    public void run() {
//        try {
        throw new RuntimeException();
//        } catch (RuntimeException e) {
//            System.out.println("e");
//        }
    }
}
/*
* 一月 29, 2023 11:22:01 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 线程异常thread0
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕获thread0java.lang.RuntimeException
一月 29, 2023 11:22:01 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 线程异常thread1
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕获thread1java.lang.RuntimeException
一月 29, 2023 11:22:02 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 线程异常thread2
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕获thread2java.lang.RuntimeException
一月 29, 2023 11:22:02 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 线程异常thread3
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕获thread3java.lang.RuntimeException
Process finished with exit code 0
* */

到此这篇关于Java异常处理UncaughtExceptionHandler使用实例代码详解的文章就介绍到这了,更多相关Java UncaughtExceptionHandler内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解JAVA设计模式之模板模式

    详解JAVA设计模式之模板模式

    这篇文章主要介绍了详解JAVA设计模式之模板模式的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 使用mybatis格式化查询出的日期

    使用mybatis格式化查询出的日期

    这篇文章主要介绍了使用mybatis格式化查询出的日期,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • mybatis resultMap之collection聚集两种实现方式

    mybatis resultMap之collection聚集两种实现方式

    本文主要介绍了mybatis resultMap之collection聚集两种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • java 计算中位数的实现方法

    java 计算中位数的实现方法

    这篇文章主要介绍了java 计算中位数的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 浅谈JackSon的几种用法

    浅谈JackSon的几种用法

    这篇文章主要介绍了浅谈JackSon的几种用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Spring MVC访问静态文件_动力节点Java学院整理

    Spring MVC访问静态文件_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Spring MVC访问静态文件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • java如何实现图片转化为数据流

    java如何实现图片转化为数据流

    这篇文章主要介绍了java如何实现图片转化为数据流,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java使用云片API发送短信验证码

    Java使用云片API发送短信验证码

    这篇文章主要介绍了Java使用云片API发送短信验证码,主要用的是Java实现短信验证码。需要的朋友可以参考下
    2017-02-02
  • Java之CMS和G1垃圾回收过程的异同说明

    Java之CMS和G1垃圾回收过程的异同说明

    CMS垃圾回收器主要基于并发-清理算法,目的是减少停顿时间,通过四个主要阶段进行垃圾回收:初始标记、并发标记、重新标记和并发清理,G1垃圾回收器采用标记-整理算法,是JDK9后的默认垃圾收集器,设计为全功能全代收集器
    2024-09-09
  • Java Socket编程从零到实战详解(完整实战案例)

    Java Socket编程从零到实战详解(完整实战案例)

    这篇文章主要介绍了Java Socket编程从零到实战详解,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-04-04

最新评论