使用JVM怎么处理未捕获的异常

  介绍

使用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怎么处理未捕获的异常

<强>线程发生了未捕获异常,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(如果存在的话)

使用JVM怎么处理未捕获的异常