參考:Java核心技術 卷I 基礎知識 第七章
異常處理的任務就是将控制權從錯誤産生的地方轉移給能夠處理這種情況的錯誤處理器。
所有的異常都是由Throwable繼承而來,但在下一層立即分解為兩個分支:Error和Exception。
Error類層次結構描述了Java運作時系統的内部錯誤和資源耗盡錯誤。應用程式不應該抛出這種類型的對象。如果出現了這樣的内部錯誤,除了通告給使用者,并盡力使程式安全地終止之外,再也無能為力了。
在設計Java程式時,需要關注Exception層次結構。這個層次結構又分解為兩個分支。一個分支派生于RuntimeException,另一個分支包含其他異常。劃分兩個分支的規則是:由程式錯誤導緻的異常屬于RuntimeException,而程式本身沒有問題。但由于像I/O錯誤這類問題導緻的異常屬于其他異常。
派生于RuntimeException的異常包含下面幾種情況:
- 錯誤的類型轉換
- 數組通路越界
- 通路null指針
不是派生于RuntimeException的異常包括:
- 試圖在檔案尾部後面讀取資料
- 試圖打開一個不存在的檔案
- 試圖根據給定的字元串查找Class對象,而這個字元串表示的類并不存在
Java語言規範将派生于Error類或RuntimeException類的所有異常稱為非受檢查異常。所有的其它異常稱為受查異常。
在遇到下面四種情況時應該抛出異常:
(1)調用一個抛出受查異常的方法
(2)程式運作過程中發現錯誤,并且利用throw語句抛出一個受查異常
(3)程式出現錯誤。例如a[-1]=0會抛出一個ArrayIndexOutOfBoundsException這樣的非受查異常
(4)Java虛拟機和運作時庫出現的内部錯誤
總之,一個方法必須聲明所有可能抛出的受查異常,而非受查異常要麼不可控制(Error),要麼就應該避免發生(RuntimeException)。如果方法沒有聲明所有可能發生的受查異常,編譯器就會發出一個錯誤消息。
通常應該捕獲那些知道如何處理的異常,而将那些不知道怎樣處理的異常繼續進行傳遞。
在catch子句中可以抛出異常,目的是改變異常類型。
堆棧軌迹是一個方法調用過程的清單,它包含了程式執行過程中方法調用的特定位置。
異常機制使用的幾個技巧:
- 異常處理不能代替簡單的測試,隻在異常情況下使用異常機制
- 不要過分細化異常
- 利用異常層次結構
- 不要壓制異常
- 在檢測錯誤時,“苛刻”要比放任更好
- 不要羞于傳遞異常
斷言機制允許在測試期間向代碼中插入一些檢查語句,當代碼釋出時,這些插入的檢測語句會被自動地移走。
當啟用或禁用斷言時,不必重新編譯程式,啟用或禁用斷言是類加載器的功能。
使用斷言的時間:
- 斷言失敗是緻命的、不可恢複的錯誤
- 斷言檢查隻用于開發和測試階段