首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么对uncaughtexception的处理似乎发生在发生异常行为的死线程中?

基础概念

UncaughtException 是指在 Java 程序中,当一个线程因为未捕获的异常而终止时,JVM 会调用该线程的 UncaughtExceptionHandler。如果没有为线程设置 UncaughtExceptionHandler,则会使用默认的处理方式,通常是打印异常信息到标准错误流。

原因分析

当一个线程因为未捕获的异常而终止时,JVM 会尝试调用该线程的 UncaughtExceptionHandler。如果这个异常没有被捕获,线程会立即终止,进入“死线程”状态。此时,JVM 会处理这个未捕获的异常。

解决方法

为了避免 UncaughtException 导致线程终止,可以为线程设置一个自定义的 UncaughtExceptionHandler。这样,当线程因为未捕获的异常而终止时,可以执行一些清理工作或记录日志。

示例代码

代码语言:txt
复制
public class UncaughtExceptionExample {

    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            throw new RuntimeException("Uncaught exception in thread");
        });

        // 设置自定义的 UncaughtExceptionHandler
        thread.setUncaughtExceptionHandler((t, e) -> {
            System.err.println("Uncaught exception in thread " + t.getName() + ": " + e.getMessage());
            // 可以在这里执行一些清理工作或记录日志
        });

        thread.start();
    }
}

应用场景

  1. 日志记录:在生产环境中,记录未捕获异常的详细信息,有助于排查问题。
  2. 资源清理:在某些情况下,线程终止前需要进行一些资源清理工作,例如关闭文件、数据库连接等。
  3. 异常处理:对于某些特定的异常,可以进行自定义的处理逻辑,而不是简单地让线程终止。

参考链接

通过设置自定义的 UncaughtExceptionHandler,可以有效地处理未捕获的异常,避免线程意外终止,并提供更多的控制和灵活性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

01.崩溃捕获设计实践方案

MonitorFileLib 02.App崩溃流程 2.1 为何崩溃推出App 线程抛出异常以后处理逻辑 一旦线程出现抛出异常,并且在没有捕捉情况下,JVM将调用ThreaddispatchUncaughtException...线程出现未捕获异常后,JVM将调用ThreaddispatchUncaughtException方法把异常传递给线程未捕获异常处理器。...处理捕获异常相关操作,就是在这个方法处理@Override public void uncaughtException(Thread t, Throwable e) { //处理业务,可以拿到线程异常...崩溃进程是前台进程还是后台进程,崩溃是不是发生在 UI 线程。 崩溃堆栈和类型。崩溃是属于 Java 崩溃、Native 崩溃,还是 ANR,对于不同类型崩溃我们关注点也不太一样。...收集崩溃时应用信息 崩溃场景(崩溃发生在哪个 Activity 或 Fragment,发生在哪个业务) 关键操作路径(记录关键用户操作路径,这对我们复现崩溃会有比较大帮助) 其他自定义信息(不同应用关心重点不一样

40120

03.Android崩溃Crash库之ExceptionHandler分析

-- 通过设置未捕获到默认异常处理程序,应用程序可以为那些已经接受系统提供任何“默认”行为线程改变未捕获到异常处理方式(如记录到某一特定设备或文件)。...如果 ThreadGroup 对象处理异常没有什么特殊要求,那么它可以将调用转发给默认未捕获异常处理程序。...异常回调:uncaughtException uncaughtException (Thread t, Throwable e) 是一个抽象方法,当给定线程因为发生了未捕获异常而导致终止时将通过该方法将线程对象和异常对象传递进来...发生时会转入该函数来处理 * 该方法来实现运行时线程进行异常处理 */ @Override public void uncaughtException(Thread...,JVM将调用ThreaddispatchUncaughtException方法把异常传递给线程未捕获异常处理器。

1.9K20
  • App为什么会crash?一篇文章带你探究根本原因 ,事情没有你想得那么简单!

    image.png 前言 看到这个问题,马上就可以回答出来:因为抛出异常就会 crash。 那么为什么抛出异常就会 crash 呢? 有没有办法不让 App crash 呢?...接下来我们进入正题吧 先探讨一下第一个问题吧:为什么抛出异常就会 crash。...首先我们看下线程抛出异常以后处理逻辑吧: 一旦代码抛出异常,并且我们没有捕捉情况下,JVM 会调用 Thread dispatchUncaughtException 方法。...App crash 问题了~ 不过事情当然没有那么快就结束,这里给主线程Looper 发送 loop 循环都是主线程操作,那么子线程如果抛出异常怎么办呢,这么处理应该也是会 crash 吧,那就再做个实验吧...另外如果本该 crash 地方最终没有 crash ,说不定会导致后续一连串 App 问题发生。所以这种方式看看就好,最好方式就是控制代码质量,尽量减少 crash 发生

    1.3K10

    Java多线程面试问答

    在这里,我从面试角度列出了大多数重要Java多线程面试问题,但是您应该Java线程有足够知识来处理后续问题。...可以,我们可以调用Thread类run()方法,但是它行为类似于普通方法。要在线程实际执行它,我们需要使用Thread.start()方法启动它。...它具有两个主要功能–获取线程活动线程列表,并为该线程设置未捕获异常处理程序。...但是Java 1.5添加了setUncaughtExceptionHandler(UncaughtExceptionHandler eh)方法,使用该方法可以将未捕获异常处理程序添加到线程。...死锁是两个或多个线程永远被阻塞编程情况,这种情况发生在至少两个线程和两个或更多资源情况下。

    1.2K40

    Java避坑指南:ThreadPoolExecutor提交任务出现异常异常是否吞掉,线程是否退出不同影响

    异常信息堆栈最终由标准错误输出:: java.lang.ThreadGroup#uncaughtException 异常处理完回到任务处理流程,导致while循环从队列取任务处理中断即线程退出,执行...我们需要在提交任务自行处理异常,不再抛出此异常,并且日志输出异常堆栈,最好设置线程UncaughtExceptionHandler 作为异常输出兜底处理: ThreadFactory threadFactory...我们想要得知任务有没有异常,也只能通过: java.util.concurrent.FutureTask#get() 获取,所以,永远不能忽略任务结果,否则任务执行中发生异常无从得知。...如果我们使用线程submit方法提交任务,任务没处理异常,而又不关心结果,即没调用: java.util.concurrent.FutureTask#get() ,那我们任务异常,就永远丢失了。...我们需要在提交任务自行处理异常,不再抛出此异常,并且日志输出异常堆栈,最好设置线程UncaughtExceptionHandler 作为异常输出兜底处理

    1.3K10

    聊一聊未捕获异常与进程退出关联

    之前文章JVM 如何处理未捕获异常 我们介绍了JVM如何处理未捕获异常,今天我们研究一个更加有意思问题,就是在JVM如果发生了未捕获异常,会导致JVM进程退出么。...,我们将验证以下场景 在子线程制造未捕获异常 在主线程制造未捕获异常 同时上面的场景,在通用JVM和Android上表现有一些差异,我们也都会进行覆盖研究。...子线程未捕获异常 我们使用下面的代码,模拟一个在子线程中出现未捕获异常场景。...所以出现未捕获异常,默认就会走到了Android系统默认设置所有线程共用处理者。 如果发生在线程呢 前面说都是子线程,那么如果主线程出现未捕获异常,进程应该会退出吧。...那么这是为什么呢,看过我之前文章JVM 守护线程朋友应该了解 JVM退出通常有两种情况 有效调用System.exit() 所有的非守护线程退出后,JVM就会自动退出 因此不难得出结论 第一段代码

    1.4K10

    能否让APP永不崩溃—小光和我对决

    前言 关于拦截异常,想必大家都知道可以通过Thread.setDefaultUncaughtExceptionHandler来拦截App中发生异常,然后再进行处理。...我们还得从异常源码开始说起: 一般情况下,一个应用中所使用线程都是在同一个线程组,而在这个线程组里只要有一个线程出现未被捕获异常时候,JAVA 虚拟机就会调用当前线程所在线程 uncaughtException...应用在使用过程,主线程所有操作比如事件点击,列表滑动等等都是在这个循环中完成处理,其本质就是将消息加入MessageQueue队列,然后循环从这个队列取出消息并处理,如果没有消息处理时候,就会依靠...这样就会导致后续所有的主线程消息都会走到我们这个loop方法中进行处理,也就是一旦发生了主线程崩溃,那么这里就可以进行异常捕获。...主要有以下做法: 通过在主线程里面发送一个消息,捕获主线程异常,并在异常发生后继续调用Looper.loop方法,使得主线程继续处理消息。

    55110

    App怎么做才能永不崩溃

    然后在重写uncaughtException(t: Thread, e: Throwable)收集日志信息。 为什么出现异常了,程序会停止运行呢?.... * * * 以上是一段加过戏面试场景,考察异常处理,以及Handler对应原理了解程度。 接下来我们一个一个分析问题。 * * * try catch会影响程序运行性能么?...* * * 为什么出现异常了,程序会停止运行呢?...(死循环)取出一个个Message交给Handler处理,而Hander处理完成进行了响应,我们行为也就得到了应答,影响越快我们就会认为系统越流畅。...,所以再出现崩溃时候会调用到 ThreadGroup.uncaughtException(),再处理异常就会到我们自己实现MyCrashHandler了,所以也就不会退出进程了。

    64740

    【云+社区年度征文】能否让APP永不崩溃—小光和我对决

    前言 关于拦截异常,想必大家都知道可以通过Thread.setDefaultUncaughtExceptionHandler来拦截App中发生异常,然后再进行处理。...我们还得从异常源码开始说起: 一般情况下,一个应用中所使用线程都是在同一个线程组,而在这个线程组里只要有一个线程出现未被捕获异常时候,JAVA 虚拟机就会调用当前线程所在线程 uncaughtException...应用在使用过程,主线程所有操作比如事件点击,列表滑动等等都是在这个循环中完成处理,其本质就是将消息加入MessageQueue队列,然后循环从这个队列取出消息并处理,如果没有消息处理时候,就会依靠...这样就会导致后续所有的主线程消息都会走到我们这个loop方法中进行处理,也就是一旦发生了主线程崩溃,那么这里就可以进行异常捕获。...主要有以下做法: 通过在主线程里面发送一个消息,捕获主线程异常,并在异常发生后继续调用Looper.loop方法,使得主线程继续处理消息。

    48120

    能否让APP永不崩溃—小光和我对决

    前言 关于拦截异常,想必大家都知道可以通过Thread.setDefaultUncaughtExceptionHandler来拦截App中发生异常,然后再进行处理。...我们还得从异常源码开始说起: 一般情况下,一个应用中所使用线程都是在同一个线程组,而在这个线程组里只要有一个线程出现未被捕获异常时候,JAVA 虚拟机就会调用当前线程所在线程 uncaughtException...应用在使用过程,主线程所有操作比如事件点击,列表滑动等等都是在这个循环中完成处理,其本质就是将消息加入MessageQueue队列,然后循环从这个队列取出消息并处理,如果没有消息处理时候,就会依靠...这样就会导致后续所有的主线程消息都会走到我们这个loop方法中进行处理,也就是一旦发生了主线程崩溃,那么这里就可以进行异常捕获。...主要有以下做法: 通过在主线程里面发送一个消息,捕获主线程异常,并在异常发生后继续调用Looper.loop方法,使得主线程继续处理消息。

    73040

    如何处理JDK线程池内线程执行异常?讲得这么通俗,别还搞不懂

    前言 本篇 《如何处理 JDK 线程池内线程执行异常》 这篇文章适合哪些小伙伴阅读呢? 适合工作中使用线程池却不知异常处理流程,以及不知如何正确处理抛出异常 1....带着问题看文章 1、线程池如何输出打印运行任务时抛出异常? 2、线程池 execute()、submit() 处理异常是否一致? 3、都有哪些方式可以处理任务异常?...如何处理运行任务时抛出异常 这个问题我们以 execute() 为例, 先看下源码是如何处理 如果看过前面两篇线程池文章小伙伴第一个任务执行流程是比较清晰 execute() -> addWorker...而线程牵扯到批量管理线程,如批量停止或挂起等概念, 这里不过多分析 获取到具体执行策略后, 我们查看下 ThreadGroup#uncaughtException 是如何处理 public void...} catch (Exception ex) { ... } }); pool.shutdown(); } 在 catch 块异常进行处理

    43020

    线程如何进行异常处理?

    基于这样设计理念,在Java线程方法异常(无论是checked exception还是unchecked exception),都应该在线程代码边界之内(run方法内)进行try catch并处理掉...换句话说,我们不能捕获从线程逃逸异常。 二、未捕获异常如何处理 一个异常被抛出后,如果没有被捕获处理,则会一直向上抛。...异常一旦被Thread.run() 抛出后,就不能在程序异常进行捕获,最终只能由JVM捕获。...三、那么,JVM如何处理线程抛出异常呢 查看Thread类源码,我们可以看到有个dispatchUncaughtException方法,此方法就是用来处理线程抛出异常。...uncaughtException()方法来处理异常,并且是直接打印到控制台。

    1.2K20

    能否让APP永不崩溃—小光与我对决

    前言 关于拦截异常,想必大家都知道可以通过Thread.setDefaultUncaughtExceptionHandler来拦截App中发生异常,然后再进行处理。...我们还得从异常源码开始说起: 一般情况下,一个应用中所使用线程都是在同一个线程组,而在这个线程组里只要有一个线程出现未被捕获异常时候,JAVA 虚拟机就会调用当前线程所在线程 uncaughtException...应用在使用过程,主线程所有操作比如事件点击,列表滑动等等都是在这个循环中完成处理,其本质就是将消息加入MessageQueue队列,然后循环从这个队列取出消息并处理,如果没有消息处理时候,就会依靠...这样就会导致后续所有的主线程消息都会走到我们这个loop方法中进行处理,也就是一旦发生了主线程崩溃,那么这里就可以进行异常捕获。...主要有以下做法: 通过在主线程里面发送一个消息,捕获主线程异常,并在异常发生后继续调用Looper.loop方法,使得主线程继续处理消息。

    27430

    JVM 如何处理未捕获异常

    继之前文章 详解JVM如何处理异常,今天再次发布一篇比较关联文章,如题目可知,今天聊一聊在JVM中线程遇到未捕获异常问题,其中涉及到线程如何处理未捕获异常和一些内容介绍。...e); 用来处理接收处理异常发生操作,比如收集崩溃信息并上报等 可以通过 实例方法 Thread.setUncaughtExceptionHandler 为某一个Thread实例设置未捕获异常处理者...自身实现了Thread.UncaughtExceptionHandler,用来相应处理其内部线程和ThreadGroup发生未捕获异常。...线程发生了未捕获异常,JVM怎么处理 分发Throwable实例 当线程A中出现了未捕获异常时,JVM会调用线程AdispatchUncaughtException(Throwable)方法 1 2...(this, e); } 获取未捕获异常处理者 每个线程会有一个变量(uncaughtExceptionHandler)来保存未捕获异常处理者 在线程需要确定Throwable分发目标的处理者时,优先获取当前线程

    1.5K30

    有的线程它死了,于是它变成一道面试题

    整个面试过程,有这么一道题给我留下了深刻印象: 一个线程池中线程异常了,那么线程池会怎么处理这个线程? 需要说明一下,文中讨论线程池都是Executors线程池。...---- 1 来吧,一起分析一波 好了现在回到阿里面试官问我这道面试题: 一个线程池中线程异常了,那么线程池会怎么处理这个线程? 先说说我当时回答,因为心里没底,我回答很犹豫也很烂!...所以,现在知道为什么回答:抛出堆栈异常只对了一半吧。 execute方法执行时,会抛出(打印)堆栈异常。...在java.lang.ThreadGroup#uncaughtException进行了异常处理: ? 这个uncaughtException是何许人也,看java doc上咋说: ?...不要背答案,要理解,要深入,上面说完后记得在问问面试官,需要我从源码角度讲一讲吗?这逼装,礼貌而不失风度。 以上,我关于《一个线程池中线程异常了,那么线程池会怎么处理这个线程?》

    74870

    调用线程不可捕捉异步线程异常,如何处理?

    一 背景描述 Java异常线程之间不是共享,在线程抛出异常线程自己异常,主线程并不能捕获到。...//B }).start(); } 上面A和B运行是互相独立,虽然说你看到B所在代码块函数内容在main,但是main并不能捕获到这个Runnable里函数异常,因为它不在同一个线程之中运行...,B抛出异常如果你不在另一个线程捕获的话,相当于就是没有异常处理,无法捕获。...你这里代码使用是RuntimeException,你可以试试使用必须捕获异常,编译器会报错,因为你在另一个线程没有做任何异常处理。 那么我们如何异步线程出现异常进行处理呢?...一 对于单独线程异常捕捉 在Thread,Java提供了一个setUncaughtExceptionHandler方法来设置线程异常处理函数,你可以把异常处理函数传进去,当发生线程未捕获异常时候

    2.2K30

    异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关方法 ? 在ThreadGroup也有相关异常处理方法 ? 示例 未检查异常 ?...小结 在run方法是不能够抛出异常,如果是已检查异常,那么必须进行try catch 对于未检查异常,如果没有进行处理,一旦抛出线程将会宕掉,而且在主线程并不能捕获到这个异常 难道对于未检查异常也都是...异常处理器 在Java线程run方法,对于未检查异常,借助于异常处理器进行处理 字面意思,直接理解为处理异常方法,那么如何配置这个处理异常方法呢?如何设置,又是如何调用?...(没有设置才会走全局),既可以保障灵活性,有能够对于那些没设置提供统一配置,比如统一将异常信息写入文件等,也有诸多应用场景与好处 异常处理处理逻辑 当异常发生时,JVM会调用异常分发处理器,也就是借助于...,将会在祖先线程查找第一个重写了uncaughtException线程组,然后调用他uncaughtException方法 如果都没有重写,那么使用应用默认全局异常处理器defaultUncaughtExceptionHandler

    1.5K30
    领券