Java異常體系的根類是 Throwable, 因此當寫在java代碼中寫throw拋出異常時,後面跟的對象必然是Throwable或其子類的對象。
其中Exception異常是指一些能夠恢復的異常, 例如常見的NullPointerException空指針異常。
Error指的是一些致命的錯誤,沒法經過程序代碼手段恢復的異常,例如OutOfMemoryError內存溢出錯誤。java
在上圖中除了RuntimeException、Error及其子類都是屬於unchecked的異常類型外,其餘的都是受編譯器checked檢查的異常。
unchecked不受編譯器檢查的異常, 是由於這些錯誤在程序運行過程當中是能夠經過編程手段去控制住的,
例如常見的NullPointerException空指針異常和IndexOutOfBoundsException數組下標越界的異常,這些均可以事先使用if (xx != null) 以及 if (xxx.size() > i)來控制,
或者就是徹底沒法經過程序手段控制,
例如OutOfMemoryError內存溢出異常和StackOverflowError棧溢出異常,這種Error由於沒法經過代碼層面if就能避免的,因此也屬於unchecked。程序員
checked在編譯過程當中受到編譯器的檢查,若是程序沒有對該異常作catch處理或者向上一層拋出的話,程序將沒法編譯經過,
常見的checked異常有FileNotFoundException文件不存在異常等,由於這種異常在編寫階段就能夠預見,例如這個文件極有多是不存在的,因此這種異常必需要拋出並要求程序做出處理。面試
Throwable任何異常/錯誤的祖先類,屬於checked異常。
Exception異常,能夠從異常中恢復執行的異常,屬於checked異常。
RuntimeException異常,預料以外的異常例如空指針、數組越界,屬於unchecked異常。
...Exception除了RuntimeException及其子類是unchecked異常,其餘的Exception類都是checked異常。
Error錯誤,致命問題,沒法從錯誤中恢復, 也屬於unchecked異常。
在開發過程當中,若是一些能夠預料的到的錯誤拋出異常時,儘可能拋出checked異常,例如那個文件、某個數據必定可能會不存在的狀況下,就要提示該方法的調用者,須要對這種狀況進行處理,
若是是一些預料以外的異常,則能夠使用RuntimeException,例如某個值規定必定是必須不爲空,可是程序判斷時爲空了,則要進行RuntimeException的拋出。編程
因爲finally在無論什麼狀況下都會執行,因此finally中的return或覆蓋掉其餘地方的return,最終以finally返回的爲主,圖中最終返回結果是2。數組
歡迎關注微信公衆號『碼仔zonE』,專一於分享Java、雲計算相關內容,包括SpringBoot、SpringCloud、微服務、Docker、Kubernetes、Python等領域相關技術乾貨,期待與您相遇!
微信