博客 / 詳情

返回

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

前言

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

Java異常承載的信息量超乎你的想象

Java Exception的結構設計本身就可以提供給開發者非常多的信息(如果開發者可以恰當的利用這一結構)。Exception結構如下圖所示:

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

Java Error

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

Java Exception

ExceptionError類不同,當這種類型的異常出現時,程序是可以嘗試恢復並繼續運行的。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
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.