对线程中未捕获的异常进行处理UncaughtExceptionHandler

简介: 对线程中未捕获的异常进行处理UncaughtExceptionHandler

通常程序中我们会对可能出现的异常进行捕获,例如

public static void main(String[] args) {
    
    System.out.println("##### begin");

    int dividend = 10;
    int divisor = 0;
    try {
        int result = dividend / divisor;
    } catch (Exception e) {
        System.out.println(e);
    }

    System.out.println("##### end");
}

输出结果

##### begin
java.lang.ArithmeticException: / by zero
##### end

如果程序中我们没有对可能出现的异常进行捕获,例如

public static void main(String[] args) {

    System.out.println("##### begin");

    int dividend = 10;
    int divisor = 0;
    int result = dividend / divisor;

    System.out.println("##### end");

}

输出结果

##### begin
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.yzj.ehr.controller.InnerController.main(InnerController.java:153)

Thread类有个方法setUncaughtExceptionHandler(UncaughtExceptionHandler eh),表示我们可以对一个线程自定义自己的未捕获异常处理器。
我们只需写一个类继承UncaughtExceptionHandler接口,重写void uncaughtException(Thread t, Throwable e)方法,然后传入到Thread对象中。

public static void main(String[] args) {

    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            System.out.println("这是对未捕获的异常进行处理方法");
            System.out.println("Thread name:" + t.getName() + ",ex:" + e);
        }
    });

    System.out.println("##### begin");

    int dividend = 10;
    int divisor = 0;
    int result = dividend / divisor;

    System.out.println("##### end");

}

输出结果

##### begin
这是对未捕获的异常进行处理方法
Thread name:main,ex:java.lang.ArithmeticException: / by zero

对不同线程定义不同的未捕获异常处理器

public static void main(String[] args) {

    // 定义main线程的
    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            System.out.println("这是对main线程中未捕获的异常进行处理方法");
            System.out.println("@ Thread name:" + t.getName() + ",ex:" + e);
        }
    });

    System.out.println("##### begin");
    
    new Thread(new Runnable() {
        @Override
        public void run() {
         // 定义myThread线程的
            Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
                @Override
                public void uncaughtException(Thread t, Throwable e) {
                    System.out.println("这是对myThread线程中未捕获的异常进行处理方法");
                    System.out.println("# Thread name:" + t.getName() + ",ex:" + e);
                }
            });
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            // 模拟异常
            int[] array = new int[2];
            int value = array[2];
        }
    }, "myThread").start();

    int dividend = 10;
    int divisor = 0;
    int result = dividend / divisor;

    System.out.println("##### end");

}

输出结果

##### begin
这是对main线程中未捕获的异常进行处理方法
@ Thread name:main,ex:java.lang.ArithmeticException: / by zero
这是对myThread线程中未捕获的异常进行处理方法
# Thread name:myThread,ex:java.lang.ArrayIndexOutOfBoundsException: 2
相关文章
|
5月前
|
安全 Java 开发者
丢失的8小时去哪里了?SimpleDateFormat线程不安全,多线程初始化异常解决方案
丢失的8小时去哪里了?SimpleDateFormat线程不安全,多线程初始化异常解决方案
76 0
|
20天前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
57 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
1月前
|
监控 Java
线程池中线程异常后:销毁还是复用?技术深度剖析
在并发编程中,线程池作为一种高效利用系统资源的工具,被广泛用于处理大量并发任务。然而,当线程池中的线程在执行任务时遇到异常,如何妥善处理这些异常线程成为了一个值得深入探讨的话题。本文将围绕“线程池中线程异常后:销毁还是复用?”这一主题,分享一些实践经验和理论思考。
50 3
|
2月前
|
Java 数据库连接 数据库
当线程中发生异常时的情况分析
【8月更文挑战第22天】
69 4
|
2月前
|
Java
线程池中线程抛了异常,该如何处理?
【8月更文挑战第27天】在Java多线程编程中,线程池(ThreadPool)是一种常用的并发处理工具,它能够有效地管理线程的生命周期,提高资源利用率,并简化并发编程的复杂性。然而,当线程池中的线程在执行任务时抛出异常,如果不妥善处理,这些异常可能会导致程序出现未预料的行为,甚至崩溃。因此,了解并掌握线程池异常处理机制至关重要。
152 0
|
2月前
|
缓存 开发框架 NoSQL
【Azure Redis 缓存】Azure Redis 异常 - 因线程池Busy而产生的Timeout异常问题
【Azure Redis 缓存】Azure Redis 异常 - 因线程池Busy而产生的Timeout异常问题
|
2月前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
32 0
|
5月前
|
运维 负载均衡 Java
nacos常见问题之单机nacos2.2.3线程池异常如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
5月前
|
C++
C++多线程场景中的变量提前释放导致栈内存异常
C++多线程场景中的变量提前释放导致栈内存异常
55 0