Java的可檢測異常和非檢測異常涇渭分明。可檢測異常經編譯器驗證,對於聲明拋出異常的任何方法,編譯器將強制執行處理或聲明規則。
非檢測異常不遵循處理或聲明規則。在產生此類異常時,不一定非要采取任何適當操作,編譯器不會檢查是否已解決了這樣一個異常。有兩個主要類定義非檢測異常:RuntimeException和Error。
為什么Error子類屬於非檢測異常?這是因為無法預知它們的產生時間。若Java應用程序內存不足,則隨時可能出現OutOfMemoryError;起因一般不是應用程序中的特殊調用,而是JVM自身的問題。另外,Error類一般表示應用程序無法解決的嚴重問題,故將這些類視為非檢測異常。
RuntimeException類也屬於非檢測異常,一個原因是普通JVM操作引發的運行時異常隨時可能發生。與Error不同,此類異常一般由特定操作引發。但這些操作在Java應用程序中會頻繁出現。例如,若每次使用對象時,都必須編寫異常處理代碼來檢查null引用,則整個應用程序很快將變成一個龐大的try-catch塊。因此,運行時異常不受編譯器檢查與處理或聲明規則的限制。
將RuntimeException類作為未檢測異常還有一個原因:它們表示的問題不一定作為異常處理。可以在try-catch結構中處理NullPointerException,但若在使用引用前測試空值,則更簡單,更經濟。同樣,可以在除法運算時檢查0值,而不使用ArithmeticException。
非檢測異常拋出時,可不聲明不使用try-catch語句;對於檢測異常拋出時須聲明且使用try-catch語句