Error類對象由Java虛擬機器產生並拋出,Exception類對象由應用程式處理或拋出
Error表示恢複不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢出。不可能指望程式能處理這樣的情況。
Error表示系統級的錯誤和程式不必處理的異常。
Exception 是checked (java 編譯器必須要求 catch),大概指一類可以預知的,當發生異常後知道如何處理的異常,所以需要捕獲。
RuntimeException 是屬於unchecked (java 編譯器允許不catch)表示一類 未知的不確定的只有在運行時才會出現的異常。
之所以區分 checked/unchecked exception,JAVA的設計思想是區分從類/方法設計者角度來看兩種不同的異常:
一種是設計者認為這個方法在使用過程中使用者能夠處理的異常,這些往往作為checked exception。比如一個IO系統的設計者會認為諸如物理檔案不存在或者介質無法讀取等異常時很可能發生,而使用者完全可能捕獲這個異常,通過讓使用者 重新輸入檔案名稱等方式重新進行這個操作,也就是說,這是一個可恢複的操作。所以我會在諸如 read()/write()等操作中throw 一個 IOException(checked exception)。 第二種是設計者認為使用者不能夠處理的異常,比如我寫一個函數要求傳入的參數是個正數,那麼當我發現使用者傳 了個負數進來時,合理的預期是程式中出bug了。如果我拋出一個異常描述這件事,即使我要求調用者捕獲這個異常,他肯定也不知道該怎麼辦(總不能隨便傳一 個正數進來吧)。這時候我就會拋出一個IllegalArgumentException(uncheck exception),這裡面的潛台詞是:小子,我知道你也是幫人背黑鍋的,處理不了這個,你還是交給你的領導(調用你的程式)去處理這個異常吧。 同理,當JVM發現除數為0時,拋出的ArithmeticException也是一個unchecked exception。
從這裡可以看出,checked exception和 unchecked exception的根本區別在於設計者認為
使用者是否能夠並且應該處理這個異常。不幸的是,由於Java使用者水平的參差不齊,大量的 unchecked exception該被設計成了checked exception,而對於真正的checked exception,又有太多被catch了之後啥都不作就悄無聲息了。尤其是不聲不響吞噬exception的行為,不但達不到設計者本來的要求(進行 恢複處理),甚至問題更大(連 unchecked exception那種最後報錯的效果都沒了)。