Jvm处理Java Thread 的run方法中抛出异常的流程

众所周知,Java中在进行方法调用的时候,可能存在两种异常处理的场景:

  1. 被调用的方法在定义的时候就存在throws关键字,这种被抛出的异常,在Thread的run方法中,只能被try-catch语句块捕获,因为run方法本身是没有throws关键字的;
  2. 被调用的方法在定义的时候不存在throws关键字,但是仍然可能抛出异常,比如在Thread的run方法中,调用String的Parse系列方法对非数字的字符进行解析,就可能会抛出NumberFormatException,这种JVM是按照如下方式处理的:
    • 首先看当前的线程,是否在start之前,通过调用setUncaughtExceptionHandler(UncaughtExceptionHandler, eh),设置了UncaughtExceptionHandler;如果已经设置,则使用此ExceptionHandler来处理;
    • 否则,查看当前Thread所在的ThreadGroup,是否设置了UncaughtExceptionHandler;如果已经设置,则使用此ExceptionHandler来处理;
    • 否则,查看Thread层面是否设置了UncaughtExceptionHandler,Thread类的静态方法setDefaultUncaughtExceptionHandler进行设置;如果已经设置,则使用此ExceptionHandler来处理;
    • 如果上述UncaughtExceptionHandler都没有找到,那么JVM会直接在console中打印Exception的StackTrace信息。
posted @ 2015-02-05 15:57  自由协会会长  阅读(5161)  评论(0编辑  收藏  举报