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信息。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM