異常處理器處理邏輯深入解析,本文對異常處理器進行了深入的剖析,本文能夠讓你對異常處理邏輯有一個清晰的認知 ...
在Thread中有異常處理器相關的方法


示例
未檢查異常


已檢查異常



小結
在run方法中是不能夠拋出異常的,如果是已檢查的異常,那麼必須進行try catch 對於未檢查的異常,如果沒有進行處理,一旦拋出線程將會宕掉,而且在主線程中並不能捕獲到這個異常 難道對於未檢查的異常也都是try catch嗎?(當然,這是一種方式) 還有沒有其他解決方案?異常處理器
在Java線程的run方法中,對於未檢查異常,藉助於異常處理器進行處理的 字面意思,直接理解為處理異常的方法,那麼如何配置這個處理異常的方法呢?如何設置,又是如何調用? UncaughtExceptionHandler,是Thread的內部介面(1.8中已經設置為函數式介面)




兩個處理器含義
我們看到了錶面的樣子,但是這兩個內部變數到底幹嘛的? 對於defaultUncaughtExceptionHandler,表示的是應用程式預設的,應用程式預設的,也就是整個程式使用的,可以看得到,對於他的getter和setter以及自身,都是static修飾的 對於uncaughtExceptionHandler,屬於實例方法,也就是說每個線程可以擁有一個 簡言之:每個線程都可以有一個uncaughtExceptionHandler,整個應用可以有一個defaultUncaughtExceptionHandler 全局和個體的關係,就如同我們平時見到的其他概念一樣,如果單獨設置了,那麼就使用自己的,如果沒有設置就走全局的 既可以單獨設置,又可以全局設置(沒有設置的才會走全局),既可以保障靈活性,有能夠對於那些沒設置的提供統一配置,比如統一將異常信息寫入文件等,也有諸多應用場景與好處異常處理器處理邏輯
當異常發生時,JVM會調用異常分發處理器,也就是藉助於getUncaughtExceptionHandler方法,獲取異常處理器,然後執行他的uncaughtException方法 第一個參數就是當前線程this,第二個參數就是異常對象 看註釋:JVM調用


代碼示例


總結
在Thread中的run方法,不能夠拋出異常,只能進行捕獲- 對於已檢查異常,必須捕獲
- 對於未檢查異常,你也可以進行try catch,但是代碼始終包裹在try中,真的好嗎?
- 還另外提供了異常處理器機制用於處理未檢查異常
- 如果設置了異常處理器uncaughtExceptionHandler,那麼將會使用這個
- 如果沒設置,將會在祖先線程組中查找第一個重寫了uncaughtException的線程組,然後調用他的uncaughtException方法
- 如果都沒有重寫,那麼使用應用預設的全局異常處理器defaultUncaughtExceptionHandler
- 如果還是沒有設置,直接標準錯誤列印信息