1. 程式人生 > >Java常用的異常處理情況總結

Java常用的異常處理情況總結

Java中,所有異常都繼承自Throwable類(一個完整可用的類)。整體上分為Error、Exception兩個大類,Exception大類又分為UncheckedException(繼承於RuntimeException)和CheckedException(繼承於Exception,但不繼承於RuntimeException)。

常用的異常類:

類別:

1.Error        常用異常類:AssertionError、OutOfMemoryError、StackOverflowError

2.UncheckedException          常用異常類:

AlreadyBoundException、ClassCastException、ConcurrentModificationException、IllegalArgumentException、IllegalStateException、IndexOutOfBoundsException、JSONException、NullPointerException、SecurityException、UnsupportedOperationException

3.CheckedException         常用異常類:ClassNotFoundException、CloneNotSupportedException、FileAlreadyExistsException、FileNotFoundException、InterruptedException、IOException、SQLException、TimeoutException、UnknownHostException

Error

通常描述了系統級的錯誤,並且程式猿無法主動處理——當然,系統級錯誤也有可能由程式碼間接導致,這不在我們的討論範圍內。發生系統級錯誤的時候,系統環境已經不健康了,因此,Error不強制捕獲或宣告,也就是不強制處理,一般情況下只需要把異常資訊記錄下來(如果能記下當時的系統快照更好)。

(OutOfMemoryError)

當可用記憶體不足時,會由JVM丟擲OutOfMemoryError。一般由三種原因導致:

  • 堆設定過小,不滿足正常的記憶體需求
  • 程式碼中存在記憶體洩露,佔用了大量記憶體而不能被回收
  • 選擇的GC演算法與某些極端的應用場景不匹配,記憶體碎片過多,沒有足夠大的連續空間分配給物件

JVM丟擲OutOfMemoryError前,會嘗試進行一次Full GC,如果GC後可用記憶體還是不足,才會丟擲OutOfMemoryError。因此,這時程式猿必然無法主動處理這一問題,只能等程式崩潰後再去查證原因。

UncheckedException

嚴格來說,Error也可以被劃歸UncheckedException,但我們更習慣用UncheckedException描述執行期發生,通常由於程式碼問題直接引起的程式相關的錯誤,並且程式猿無法主動處理。注意區分,系統級錯誤都應該用Error描述。UncheckedException發生的大部分情況是程式碼寫挫了,因此,UncheckedException也不強制捕獲或宣告,也就是不強制處理,一般情況下記下日誌即可。

不同的是,如果可能,要保證UncheckedException是可控的(在異常被動丟擲前檢查並主動丟擲)。

JSONException就是不可控的。

(NullPointerException)

NullPointerException是最常見的UncheckedException。如果在一個空指標上引用方法或變數等,則執行期會丟擲NullPointerException。空指標讓程式變的不可控:如果任由空指標在程式執行期隨意傳遞、使用,我們將無法確定程式的行為,也無法確定捕獲NullPointerException時程式所處的狀態。

解決這一問題的方法很簡單:

  • 儘早檢查並主動丟擲異常
  • 單獨、提前處理邊界條件
  • 儘量不使用null表示狀態,特別是在集合中

CheckedException

CheckedException描述了外部環境導致的不太嚴重的錯誤,程式猿應該主動處理。注意與系統級錯誤區分,系統級錯誤通常是不可恢復的。因此,CheckedException強制捕獲或宣告,程式猿必須處理。記錄日誌,包裝後再次丟擲,在方法簽名中宣告,是三種最常見的做法。

同UncheckedException一樣,CheckedException也要保證是可控的。對CheckedException的可控性要求更高,不僅要主動檢查,還要在捕獲到異常時,作出合適的處理。

(IOException)

產生IOException的原因非常多,但很多時候我們並不關心細節原因,因為檔案系統是一個不太可控的因素,這時我們可以以IOException為粒度處理;某些需要關心細節的異常情況,則應使用IOException的子類,以分情況處理。

參考: 猴子007