1. 程式人生 > >Java核心技術36講 第二講:Exception和Error

Java核心技術36講 第二講:Exception和Error

對比Exception和Error

  1. Exception和Error都是繼承自Throwable類。
    Exception是程式正常執行中,可以預料的意外情況,可能並且應該被捕獲,進行相應處理。
    Error是指在正常情況下,不大可能出現的情況,絕大部分的Error都會導致程式(比如JVM自身)處於非正常情況,所以不便於也不需要捕獲,常見的比如OutOfMemoryError之類都是Error的子類。

  2. Exception又分為可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常必須在原始碼裡顯示捕獲處理,不檢查異常就是所謂的執行時異常, 類似NullPointerException、ArrayIndexOutOfBoundsException之類,通常可以編碼避免邏輯錯誤,可以根據需要判斷是否去捕獲,並不會在編譯時強制要求。

  3. 儘量不要捕獲類似Exception這樣的通用異常,而是應該捕獲特定異常

  4. 不要生吞(swallow)異常。往往是基於假設這段程式碼是不可能會發生,或者感覺忽略異常是無所謂的。

  5. 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 *

ClassNotFoundException 和 NoClassDefFoundError 區別

ClassNotFoundException;
當應用程式試圖通過類的字串名稱,使用以下三種方法裝入類,但卻找不到指定名稱的類定義時丟擲該異常,是顯式類裝載的丟擲的異常。
1.類 Class 中的 forName() 方法。
2.類 ClassLoader 中的 findSystemClass() 方法。
3.類 ClassLoader 中的 loadClass() 方法。

NoClassDefFoundError:
如果 Java 虛擬機器或 ClassLoader 例項試圖裝入類定義(作為正常的方法呼叫的一部分,或者作為使用 new 表示式建立新例項的一部分),但卻沒有找到類定義時丟擲該異常。
當目前執行的類已經編譯,但是找不到它的定義時,會存在 searched-for 類定義。
實際上,這意味著 NoClassDefFoundError 的丟擲,是不成功的隱式類裝入的結果。
簡單說來,就是引用的類在類路徑中沒有找到。