Java核心技術36講 第二講:Exception和Error
對比Exception和Error
-
Exception和Error都是繼承自Throwable類。
Exception是程式正常執行中,可以預料的意外情況,可能並且應該被捕獲,進行相應處理。
Error是指在正常情況下,不大可能出現的情況,絕大部分的Error都會導致程式(比如JVM自身)處於非正常情況,所以不便於也不需要捕獲,常見的比如OutOfMemoryError之類都是Error的子類。 -
Exception又分為可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常必須在原始碼裡顯示捕獲處理,不檢查異常就是所謂的執行時異常, 類似NullPointerException、ArrayIndexOutOfBoundsException之類,通常可以編碼避免邏輯錯誤,可以根據需要判斷是否去捕獲,並不會在編譯時強制要求。
-
儘量不要捕獲類似Exception這樣的通用異常,而是應該捕獲特定異常
-
不要生吞(swallow)異常。往往是基於假設這段程式碼是不可能會發生,或者感覺忽略異常是無所謂的。
-
try-catch程式碼段會產生額外的效能開銷,建議僅捕獲有必要的程式碼段,儘量不要一個大的try包住整段程式碼。try-catch不如if-else高效。
Java每例項化一個Exception,都會對當時的棧進行快照,這是個相當重的操作,效能開銷大。
Throwable
- Error
- LinkageError
- NoClassDefFoundError *
- UnsatisfiedLinkError
- ExceptionInInitializerError
- VirtualMachineError
- OutOfMemoryError
- StackOverflowError
- Exception
- IOException
(Checked Exception) - NullPointerException
- ClassCastException
- SecurityException
- ClassNotFoundException *
- IOException
ClassNotFoundException 和 NoClassDefFoundError 區別
ClassNotFoundException;
當應用程式試圖通過類的字串名稱,使用以下三種方法裝入類,但卻找不到指定名稱的類定義時丟擲該異常,是顯式類裝載的丟擲的異常。
1.類 Class 中的 forName() 方法。
2.類 ClassLoader 中的 findSystemClass() 方法。
3.類 ClassLoader 中的 loadClass() 方法。
NoClassDefFoundError:
如果 Java 虛擬機器或 ClassLoader 例項試圖裝入類定義(作為正常的方法呼叫的一部分,或者作為使用 new 表示式建立新例項的一部分),但卻沒有找到類定義時丟擲該異常。
當目前執行的類已經編譯,但是找不到它的定義時,會存在 searched-for 類定義。
實際上,這意味著 NoClassDefFoundError 的丟擲,是不成功的隱式類裝入的結果。
簡單說來,就是引用的類在類路徑中沒有找到。