1. 程式人生 > 其它 >Error、Exception與RuntimeException的區別

Error、Exception與RuntimeException的區別

宣告:轉載自 https://blog.csdn.net/qweqwruio/article/details/81329178

先搞清楚它們三者的關係。Error與Exception都繼承自Throwable,而RuntimeException則繼承自Exception。在Java中只有Throwable型別的例項才可以被丟擲(throw)或捕獲(catch)。

Error和Exception體現了Java平臺設計者對不同異常情況的分類。Exception是程式正常執行中可以預料的意外情況,可能並且應該被捕獲,進行相應處理。Error則是指在正常情況下,不大可能出現的情況,絕大部分的Error都會導致程式(比如JVM)處於非正常的、不可恢復狀態。既然是非正常情況,所以不便於也不需要捕獲,常見的比如OutOfMemoryError,其為Error的子類。

有個經典的題目:NoClassDefFoundError和ClassNotFoundException有什麼區別?正確答案:NoClassDefFoundError是當Java虛擬機器或ClassLoader例項試圖載入某個類,但無法找到該類的定義時丟擲此異常;ClassNotFoundException是當應用程式試圖呼叫Class.forName(String)通過字串名載入類,而找不到該類定義時丟擲的異常。

Exception又分為檢查型異常和非檢查型異常。所有RuntimeException的子類即為非檢查型異常;Exception的其餘子類都為檢查型異常。所謂“檢查型異常”是指在原始碼例必須顯式地進行捕獲處理,這是編譯期檢查的一部分。也就是說,當你看到某個方法宣告中可能丟擲某個檢查型異常,那麼作為呼叫方必須考慮如何處理這個異常,否則編譯器就是給出錯誤提示。

所謂“非檢查型異常”,通常是可以通過編碼加以避免的邏輯錯誤,具體根據需要來判斷是否需要捕獲,並不會在編譯期強制要求。例如NullPointerException、ArrayIndexOutOfBoundsException等。也就是說,程式設計師應該通過合理編碼來努力避免程式出現這類異常,或者說程式出現這類異常就是程式設計師的責任。