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开发使用StringUtils.split避坑详解

    java开发使用StringUtils.split避坑详解

    这篇文章主要为大家介绍了java开发使用StringUtils.split避坑详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • java中将一个List等分成n个list的工具方法(推荐)

    java中将一个List等分成n个list的工具方法(推荐)

    下面小编就为大家带来一篇java中将一个List等分成n个list的工具方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java数据结构之链表相关知识总结

    Java数据结构之链表相关知识总结

    今天给大家带来关于Java数据结构的相关知识,文章围绕Java链表展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 常用数字签名算法RSA与DSA的Java程序内实现示例

    常用数字签名算法RSA与DSA的Java程序内实现示例

    这篇文章主要介绍了常用数字签名算法RSA与DSA的Java程序内实现示例,一般来说DSA算法用于签名的效率会比RSA要快,需要的朋友可以参考下
    2016-04-04
  • java控制台实现学生信息管理系统(集合版)

    java控制台实现学生信息管理系统(集合版)

    这篇文章主要为大家详细介绍了java控制台实现学生信息管理系统的集合版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Java 非阻塞I/O使用方法

    Java 非阻塞I/O使用方法

    这篇文章主要介绍了Java 非阻塞I/O使用方法,文中涉及非阻塞I/O的简介,同时向大家展示了利用非阻塞I/O实现客户端的方法,需要的朋友可以参考下。
    2017-09-09
  • springboot验证码生成以及验证功能举例详解

    springboot验证码生成以及验证功能举例详解

    登录注册是大部分系统需要实现的基本功能,同时也会对登录验证增加需求,下面这篇文章主要给大家介绍了关于springboot验证码生成以及验证功能的相关资料,需要的朋友可以参考下
    2023-04-04
  • java8 多个list对象用lambda求差集操作

    java8 多个list对象用lambda求差集操作

    这篇文章主要介绍了java8 多个list对象用lambda求差集操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • java实现LRU缓存淘汰算法的方法

    java实现LRU缓存淘汰算法的方法

    LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。下面看下java实现LRU缓存淘汰算法的方法,一起看看吧
    2021-11-11
  • 详解SpringCloud Config配置中心

    详解SpringCloud Config配置中心

    这篇文章主要介绍了详解SpringCloud Config配置中心,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03

最新评论