貓頭鷹的深夜翻譯:趣談Java Exception

raledong 發表於 2021-10-05
Java

前言

Java異常類(Exception)是用來處理異常程式行為的一組類。在這篇文章中,我將介紹如何使用Java異常類,以及在程式中如何設計Java異常體系。Exception類是Java體系中非常重要的一環,每一個程式設計師都必須熟悉並掌握它。

Java異常承載的資訊量超乎你的想象

Java Exception的結構設計本身就可以提供給開發者非常多的資訊(如果開發者可以恰當的利用這一結構)。Exception結構如下圖所示:
貓頭鷹的深夜翻譯:趣談Java Exception

Throwable是整個異常結構的父類,它有兩個子類,分別是ErrorException

Java Error

Error類代表出現非正常場景,一旦Error異常出現,整個應用程式可能崩潰。

Java Exception

ExceptionError類不同,當這種型別的異常出現時,程式是可以嘗試恢復並繼續執行的。Exception異常有以下兩類,執行時異常(Runtime Exception)和非執行時異常(Not Runtime Exception):
貓頭鷹的深夜翻譯:趣談Java Exception

非執行時異常也成為checked異常,這一類異常和Error異常非常類似,二者的區別在於程式在丟擲checked exception有更高的機率恢復正常。

Checked 和 Unchecked異常

Checked異常強制開發者在程式中進行處理或再次丟擲。如果checked異常被重新丟擲,則需要在方法中用throws語法宣告該異常。與之相反,Unchecked異常不需要特殊處理。這種設計結構意味著不主動處理的unchecked異常將會被拋到根類。

貓頭鷹的深夜翻譯:趣談Java Exception

如何在JAVA中進行異常處理

Java中有兩種方式處理異常:在當前方法中處理或者是重新丟擲。你可能需要一個父異常處理器,或者是執行一些其它特定邏輯,如進行重試。

貓頭鷹的深夜翻譯:趣談Java Exception

如上文所示,我們可以將異常拆分成三類:Checked,Runtime和Error。它們分別在不同的場景下丟擲,代表程式可以恢復的程度。最樂觀的是Checked異常,Runtime異常相對而言可恢復的可能性更小,最糟糕的是Error型別異常。
貓頭鷹的深夜翻譯:趣談Java Exception

在瞭解了異常的型別後,我們就可以試著回答以下問題:

  • 程式當前情況有多糟糕? 問題的原因是什麼?
  • 如何修復問題?
  • 需要重啟JVM嗎?
  • 需要重新編寫程式碼嗎?

熟悉異常後意味著我們可以推測程式是哪裡出現了問題,並且試著修復它。下面的章節會展示幾個經典的異常場景並分析原因(假設程式已經通過了編譯自測階段)

<!-- more -->

分析Error異常

先從最嚴重的Error異常說起。最常見的Error異常如下圖所示:
貓頭鷹的深夜翻譯:趣談Java Exception

在大多數情況下,你只需要修改JVM的配置或者新增缺少的依賴。當然,也有少部分場景需要對程式碼進行優化。

貓頭鷹的深夜翻譯:趣談Java Exception

分析Checked異常

對於Checked異常,它通常代表著程式有可能用某種方式從這種異常中恢復過來,比如重試。下文將會給出幾個比較經典的Checked異常,其中有些異常可能是另一些異常的父類,在此將無視這些異常中的關聯進行分析。
貓頭鷹的深夜翻譯:趣談Java Exception

所以,這張表說明了什麼呢?如果你仔細觀察,會發現大多數情況下不需要去修改程式碼,甚至不需要去重啟應用程式。

分析Runtime異常

Runtime異常是最常見的異常。通常來說Checked和Error異常並不需要程式碼變更,但是Runtime異常通常意味著必須修改程式碼才能修復這個問題。下面的表格展示了最常見的Runtime異常:
貓頭鷹的深夜翻譯:趣談Java Exception

可見Runtime異常會對程式帶來多大的傷害。它是那個導致程式碼修復,程式設計師壓力陡增和商業損失的罪魁禍首。
貓頭鷹的深夜翻譯:趣談Java Exception

Checked異常導致的程式碼汙染

根據Checked異常的定義,開發者應該將每一個可恢復的問題通過Checked異常丟擲。但是這同時意味著需要在方法定義中強制宣告這個異常,以及呼叫方必須額外增加三四行try-catch邏輯來對這個異常進行處理。如果程式中到處充斥著這樣的程式碼片段,會極大影響程式碼的可讀性。因此,我更推薦使用RuntimeException進行異常管理。即便是在設計API時,也可以通過在方法中定義Runtime異常加上註釋輔助呼叫方理解。而API呼叫方則可以自己決定是否要處理這個異常還是繼續向上丟擲。
貓頭鷹的深夜翻譯:趣談Java Exception

原文連結: dzone.com/articles/java-exceptions-1