使用JVM怎么处理未捕获的异常?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强>什么是未捕获异常强>
未捕获异常指的是我们在方法体中没有使用try - catch捕获的异常,比如下面的例子
private static void testUncaughtException (String 参数),{ ,try { ,System.out.println (1,/, arg.length ()); ,}catch (ArithmeticException e), { ,e.printStackTrace (); ,} }
上面的代码很有可能发生如下情况
- <李>
如果方法参数参数传递null,会出现NullPointerException
李> <李>如果参数参数传递内容为空的字符串(" "),会出现ArithmeticException
李>对于上面的问题,我们不难发现
- <李>
上面可能出现的NullPointerException和ArithmeticException都属于未经检查的异常
李> <李>而ArithmeticException被我们人为try - catch捕获了,它不符合本文对于未捕获异常的定义
李> <李>NullPointerException由于我们没有捕捉住,就变成了我们要聊的未捕获异常
李> <李>另外,未捕获异常实际是未经检查的异常的子集
李> <强> UncaughtExceptionHandler是什么强>
- <李>
它是线程遇到未捕获异常的一个处理者接口
李> <李>它包含一个方法<代码>空白uncaughtException(线程t, Throwable e);代码>用来处理接收处理异常发生后的操作,比如收集崩溃信息并上报等
李> <李>可以通过实例方法<代码>线程。setUncaughtExceptionHandler> 代码为某一个线程实例设置未捕获异常处理者
李> <李>也可以通过静态方法<代码>线程。setDefaultUncaughtExceptionHandler 代码>设置所有线程实例的未捕获异常处理者
李> <强> ThreadGroup是什么强>
- <李>
ThreadGroup是线程的集合
李> <李>ThreadGroup也可以包含子ThreadGroup
李> <李>除了初始的ThreadGroup之外,每个ThreadGroup都有一个父ThreadGroup
李> <李>ThreadGroup自身实现了线程。UncaughtExceptionHandler,用来相应处理其内部的线程和ThreadGroup发生未捕获异常。
李> <强>未捕获异常处理者设置指南强>
<强>线程发生了未捕获异常,JVM怎么处理强>
<强>分实发Throwable例
强>
当线程一个中出现了未捕获异常时,JVM会调用线程一个的<代码> dispatchUncaughtException (Throwable) 代码>方法
/* * ,* Dispatch an  uncaught exception 用,处理程序只却;能够method ,* intended 用be nbsp; only by 从而JVM。 ,*/private void  dispatchUncaughtException (Throwable e), { ,getUncaughtExceptionHandler () .uncaughtException (,,); }
<强>获取未捕获异常处理者强>
每个线程会有一个变量(uncaughtExceptionHandler)来保存未捕获异常的处理者
在线程需要确定Throwable分发目标的处理者时,优先获取当前线程中uncaughtExceptionHandler变量
如果出问题线程的uncaughtExceptionHandler为零(即没有显式设置异常处理者),则使用自己所在的ThreadGroup来作为未捕获异常处理者。
/* * ,* Returns 从而handler invoked when 却;能够thread abruptly 终止 ,* due 用an uncaught 例外只If 却;能够thread has not had 一个 ,* uncaught exception  handler explicitly set then 却;能够线程# 39;s ,* & lt; tt> ThreadGroup, object is 回来,unless 却;能够线程 ,* has 终止,拷贝which case & lt; tt> null is 返回。 ,* @since 1.5 ,* @return 从而uncaught exception handler for 却;能够线程 ,*/public UncaughtExceptionHandler  getUncaughtExceptionHandler (), { ,return uncaughtExceptionHandler  !=, null ? ,uncaughtExceptionHandler :集团; }
<>强如分果Throwable发给ThreadGroup 强>
- <李>
ThreadGroup会尝试转给它的父ThreadGroup(如果存在的话)