前言
Java異常類(Exception)是用來處理異常程序行為的一組類。在這篇文章中,我將介紹如何使用Java異常類,以及在程序中如何設計Java異常體系。Exception類是Java體系中非常重要的一環,每一個程序員都必須熟悉並掌握它。
Java異常承載的信息量超乎你的想象
Java Exception的結構設計本身就可以提供給開發者非常多的信息(如果開發者可以恰當的利用這一結構)。Exception結構如下圖所示:
Throwable是整個異常結構的父類,它有兩個子類,分別是Error和Exception
Java Error
Error類代表出現非正常場景,一旦Error異常出現,整個應用程序可能崩潰。
Java Exception
Exception和Error類不同,當這種類型的異常出現時,程序是可以嘗試恢復並繼續運行的。Exception異常有以下兩類,運行時異常(Runtime Exception)和非運行時異常(Not Runtime Exception):
非運行時異常也成為checked異常,這一類異常和Error異常非常類似,二者的區別在於程序在拋出checked exception有更高的機率恢復正常。
Checked 和 Unchecked異常
Checked異常強制開發者在程序中進行處理或再次拋出。如果checked異常被重新拋出,則需要在方法中用throws語法聲明該異常。與之相反,Unchecked異常不需要特殊處理。這種設計結構意味着不主動處理的unchecked異常將會被拋到根類。
如何在JAVA中進行異常處理
Java中有兩種方式處理異常:在當前方法中處理或者是重新拋出。你可能需要一個父異常處理器,或者是執行一些其它特定邏輯,如進行重試。
如上文所示,我們可以將異常拆分成三類:Checked,Runtime和Error。它們分別在不同的場景下拋出,代表程序可以恢復的程度。最樂觀的是Checked異常,Runtime異常相對而言可恢復的可能性更小,最糟糕的是Error類型異常。
在瞭解了異常的類型後,我們就可以試着回答以下問題:
- 程序當前情況有多糟糕? 問題的原因是什麼?
- 如何修復問題?
- 需要重啓JVM嗎?
- 需要重新編寫代碼嗎?
熟悉異常後意味着我們可以推測程序是哪裏出現了問題,並且試着修復它。下面的章節會展示幾個經典的異常場景並分析原因(假設程序已經通過了編譯自測階段)
<!-- more -->
分析Error異常
先從最嚴重的Error異常説起。最常見的Error異常如下圖所示:
在大多數情況下,你只需要修改JVM的配置或者添加缺少的依賴。當然,也有少部分場景需要對代碼進行優化。
分析Checked異常
對於Checked異常,它通常代表着程序有可能用某種方式從這種異常中恢復過來,比如重試。下文將會給出幾個比較經典的Checked異常,其中有些異常可能是另一些異常的父類,在此將無視這些異常中的關聯進行分析。
所以,這張表説明了什麼呢?如果你仔細觀察,會發現大多數情況下不需要去修改代碼,甚至不需要去重啓應用程序。
分析Runtime異常
Runtime異常是最常見的異常。通常來説Checked和Error異常並不需要代碼變更,但是Runtime異常通常意味着必須修改代碼才能修復這個問題。下面的表格展示了最常見的Runtime異常:
可見Runtime異常會對程序帶來多大的傷害。它是那個導致代碼修復,程序員壓力陡增和商業損失的罪魁禍首。
Checked異常導致的代碼污染
根據Checked異常的定義,開發者應該將每一個可恢復的問題通過Checked異常拋出。但是這同時意味着需要在方法定義中強制聲明這個異常,以及調用方必須額外增加三四行try-catch邏輯來對這個異常進行處理。如果程序中到處充斥着這樣的代碼片段,會極大影響代碼的可讀性。因此,我更推薦使用RuntimeException進行異常管理。即便是在設計API時,也可以通過在方法中定義Runtime異常加上註釋輔助調用方理解。而API調用方則可以自己決定是否要處理這個異常還是繼續向上拋出。
原文鏈接: dzone.com/articles/java-exceptions-1