眾所周知,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信息。