首頁 > 軟體

Java異常處理機制之異常的種類

2021-05-19 15:00:14

程式在運行過程中,經常會遇到各種各樣的問題。比如,在使用四則運算的除法的時候,程式遇到這樣的情況:

int a = 5;int b = 0;System.out.println(a/b);

我們知道0不能作為除數,因為0作為除數會是無窮大,這個結果是拿不到的。所以這個程式會報「除零異常」。

算術運算異常,具體原因為除零

我們來看第二個程式:

我們發現「b=null」時,得到另一個異常,「java.lang.NullPointerException」。這個異常就是大名鼎鼎的「空指針異常」,簡稱為「npe」。

這兩個異常有一個共同點:在程式運行到錯誤的地方之前,異常並不會表露出來。這種只有運行時才被jvm拋出的異常叫做「運行時異常」,也叫做非受檢異常(unchecked exceptions),意思是無法檢查的異常,只有運行的時候出現問題才能拋出。運行時異常有一個共同的父類,這個父類也在「java.lang」包下,全類名:「java.lang.RuntimeException」。

空指針異常,繼承了RuntimeException
算術運算異常,繼承了RuntimeException

除了上述的兩個異常,運行時異常還有許多,比如「索引越界異常(IndexOutOfBoundsException)」、類型轉換異常(ClassCastException )等。

除了運行時異常以外,java還有一類異常是可以在運行之前就檢查出來的,我們稱這類異常為受檢異常(checked exceptions)。

那麼有哪些異常是受檢異常呢?其實除了運行時異常之外的所有異常都是受檢異常。受檢異常有一個特點,先不說是什麼,我們直接上程式碼:

明明使用了正確的構造器來創建物件,為啥還是報出紅槓了呢?

使用的構造器函數

我們發現在使用了正確的構造器的情況下,程式碼卻報出紅槓了。並提示「Unhandled exception」,意為未處理的異常。也就是說,jvm在我們程式碼一寫完馬上就檢查出了這個異常。這也就是「受檢異常」這個名稱的由來。

程式已經報錯了,直接運行是不行的。我們就需要處理一下這個異常。至於怎樣處理,我會在下節詳細的介紹。

繼續談異常的種類。不管是運行時異常也好,受檢異常也罷,它們都有一個共同的祖先Exception類:

異常的父類Exception

但是我們看到即使是Exception類也繼承了一個類「Throwable」。為什麼我不說異常類的祖先是Throwable類呢?

原因在於Throwable類並不只是Exception的父類,同時還是Error的父類。也就是說,異常類裡面,Exception已經是頂級父類了。而Throwable類的另一個子類Error代表的是jvm無法處理的系統級的錯誤,比如記憶體洩漏、讀取一個非java類的類檔案等。此時由於處理這類錯誤超出了java虛擬機器的能力範圍,就會報錯。也就是「jvm」表示自己無能為力的意思。

關於java異常的分類就介紹到這裡了。小夥伴們,你們get到了嗎?


IT145.com E-mail:sddin#qq.com