【Java Exception vs Error】細談java中異常機制

java.lang.Error和java.lang.Exception都是實現了Throwable接口,整個的繼承關係如圖:
在這裏插入圖片描述
1.Error
Error是java虛擬機內部的錯誤,是由於java虛擬機缺少某種系統資源導致的。 這是比較嚴重的錯誤,是不能通過編碼避免的,也不能使用try-catch-finally代碼塊來捕獲,編譯器也不會進行檢查。程序出現Error時唯一的辦法就是終止程序
例如:StackOverFlowError(棧溢出錯誤)。是由於程序在運行過程中java虛擬機的虛擬棧機空間溢出導致的。虛擬機棧是程序運行時jvm保存方法中的變量的內存空間,使用棧的數據結構進行存儲。當棧中壓入過多的變量導致棧空間不夠,就會發生這種錯誤。

2.Exception
與Error不同,Exception是由程序帶來的異常,所以在代碼中必須添加約束進行避免或者在發生異常時進行處理。當程序中進行了避免或者使用try-catch-finally代碼塊進行了處理,發生異常時就可以保證程序正常運行,不會終止。Exception按編譯器是否進行檢查可分爲CheckedException(檢查型異常)和UnCheckedException(非檢查型異常)。

2.1 CheckedException(檢查型異常)

檢查型異常是指編譯器會進行檢查的異常,也就是讓開發者事先給出發生這種異常時的處理辦法。首先這類異常跟代碼是否有問題無關,並且不是通過編碼就能避免的,但卻是在運行時可能發生的,開發者只能通過事後挽救的方式來處理,即通過try-catch-finally代碼塊進行捕獲處理。
例如:FileNotFoundException(文件未找到異常)。這種異常是由於文件不存在導致的,跟程序是否正確沒有關係,並且無法避免,只能對這種異常進行捕獲,然後給出處理方法(例如將異常寫入日誌或者給用戶一個提示框)。
2.2 UnCheckedException(非檢查型異常)
非檢查型異常是指編譯器不會進行檢查的異常。非檢查型異常又稱爲RuntimeException(運行時異常,即運行時纔會知道這種異常會發生)。這類異常一般是由於代碼有問題導致的,開發者需要在程序中避免發生這種異常,所以一旦發生這類異常就代表這代碼有缺陷。另外,由於編譯器不會強制要求進行捕獲處理,並且程序中也不應該進行捕獲處理,所以一旦該類異常發生且沒有被捕獲,就會導致程序終止。
例如:ArrayIndexOutOfBoundsException(數組越界異常),這是由於程序中訪問了不屬於數組範圍內的元素導致的,這種異常是應該在代碼中避免的,如果發生了,那就是代碼有Bug。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章