1. 程式人生 > >對比Exception和Error——執行時異常與一般異常的區別

對比Exception和Error——執行時異常與一般異常的區別

1、Exception 和 Error 都是繼承了 Throwable 類,在 Java 中只有 Throwable 型別的例項才可以被丟擲(throw)或者捕獲(catch),它是異常處理機制的基本組成型別。
2、Exception 是程式正常執行中,可以預料的意外情況,可能並且應該被捕獲,進行相應處理。
3、Error 是指在正常情況下,不大可能出現的情況,絕大部分的 Error 都會導致程式(比如 JVM 自身)處於非正常的、不可恢復狀態。既然是非正常情況,所以不便於也不需要捕獲,常見的比如 OutOfMemoryError 之類,都是 Error 的子類。
4、Exception 又分為可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常

在原始碼裡必須顯式地進行捕獲處理,這是編譯期檢查的一部分。不檢查異常就是所謂的執行時異常,類似 NullPointerException、ArrayIndexOutOfBoundsException 之類,通常是可以編碼避免的邏輯錯誤,具體根據需要來判斷是否需要捕獲,並不會在編譯期強制要求。
5、
常見的ERROR:NoClassDefFoundError、VirtualMachineError、OutOfMemoryError、StackOverflowError
常見的Exception:IOException(Checked Exception)
RuntimeException、NullPointerException、ClassCastException、SecurityException/ClassNotFoundException

6、從效能角度來審視一下 Java 的異常處理機制,這裡有兩個可能會相對昂貴的地方:

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

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

注意:
(1) 一個函式儘管丟擲了多個異常,但是隻有一個異常可被傳播到呼叫端。最後被丟擲的異常時唯一被呼叫端接收的異常,其他異常都會被吞沒掩蓋。
(2) 不要在finally程式碼塊中處理返回值。
(3)請勿在try程式碼塊中呼叫return、break或continue語句。萬一無法避免,一定要確保finally的存在不會改變函式的返回值。

參考:楊曉峰老師《java核心技術36講》