JDK源码阅读——java.lang.Thread.UncaughtExceptionHandler

本文介绍了Java的Thread.UncaughtExceptionHandler接口,用于处理线程因未捕获异常而终止的情况。当线程抛出未捕获异常时,JVM会查找线程的UncaughtExceptionHandler并调用其uncaughtException方法。如果没有设置,会默认使用ThreadGroup。通过自定义此处理程序,可以实现异常处理并控制异常向上级调用者传递的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口

Thread.UncaughtExceptionHandler

1.概述

public static interface Thread.UncaughtExceptionHandler
当 Thread 因未捕获的异常而突然终止时,调用处理程序的接口。
当某一线程因未捕获的异常而即将终止时,Java 虚拟机将使用 Thread.getUncaughtExceptionHandler() 查询该线程以获得其 UncaughtExceptionHandler 的线程,并调用处理程序的 uncaughtException 方法,将线程和异常作为参数传递。如果某一线程没有明确设置其 UncaughtExceptionHandler,则将它的 ThreadGroup 对象作为其 UncaughtExceptionHandler。如果 ThreadGroup 对象对处理异常没有什么特殊要求,那么它可以将调用转发给默认的未捕获异常处理程序。

2.源码阅读:

 public interface UncaughtExceptionHandler {
        /**
         *  当给定线程因给定的未捕获异常而终止时,调用该方法。
         * Java Virtual Machine.
         * @param t 线程
         * @param e 异常
         */
        void uncaughtException(Thread t, Throwable e);
    }

3.用法

public class MyThreadUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
            System.out.println(t.getName()+"线程出线了异常:"+e);
            e.printStackTrace();
    }
}
  public static void main(String[] args){
        Thread.currentThread().setUncaughtExceptionHandler(new MyThreadUncaughtExceptionHandler());
        int a =5/0;
        System.out.println("异常正常结束");
    }

输入:
main线程出线了异常:java.lang.ArithmeticException: / by zero

4.总结

使用try ..catch捕获异常时,异常不会向上传递给上一级调用者。
使用自定义uncaughtExceptionhandler会对于异常处理之后返回给上一级调用者,导致程序没有正常结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值