Jvm处理Java Thread 的run方法中抛出异常的流程
众所周知,Java中在进行方法调用的时候,可能存在两种异常处理的场景:
- 被调用的方法在定义的时候就存在throws关键字,这种被抛出的异常,在Thread的run方法中,只能被try-catch语句块捕获,因为run方法本身是没有throws关键字的;
- 被调用的方法在定义的时候不存在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信息。