技術思考--請對比Exception和Error,另外,運行時異常與一般異常有什么區別?

問題思考

相同點:

JAVA中的Exception和Error都是繼承throwable類,在JAVA中繼承了throwable類的實例才可以被拋出和捕獲,它是異常的基本組成類型。

不同點:

Exception異常指程序運行過程中,可以預料的意外情況,可能并且應該被捕獲,可以進行相應處理;

Error異常指在在正常情況下,不大可能出現的情況,絕大部分的Error都會導致程序(比如JVM自身)處于非正常的、不可恢復狀態。既然是非正常情況,所以不便于也不需要捕獲,常見的比如OutOfMemoryError之類,都是Error的子類。

Exception又分為可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常指程序中需要進行顯示捕獲并處理,在文件編譯時編譯器也會進行檢查。不檢查異常指程序運行過程中的異常,我們經常遇到的 NullPointerException、ArrayIndexOutOfBoundsException之類,可以通過編碼進行避免,或者捕獲處理。

知識拓展


異常類圖

NoClassDefFoundError和ClassNotFoundException區別,參考文章:https://my.oschina.net/jasonultimate/blog/166932

異常處理時注意兩個基本原則:

第一,盡量不要捕獲類似Exception這樣的通用異常,而是應該捕獲特定異常。

第二,不要生吞異常。會導致錯誤無法追蹤

Java的異常處理機制從性能上的影響:

1.try-catch代碼段會產生額外的性能開銷,或者換個角度說,它往往會影響JVM對代碼進行優化,所以建議僅捕獲有必要的代碼段,盡量不要一個大的try包住整段的代碼;與此同時,利用異常控制代碼流程,也不是一個好主意,遠比我們通常意義上的條件語句(if/else、switch)要低效。

2.Java每實例化一個Exception,都會對當時的棧進行快照,這是一個相對比較重的操作。如果發生的非常頻繁,這個開銷就不能被忽略了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容