檢查異常
| 導航 異常 主題: |
檢查異常是一種必須在丟擲它的方法中捕獲或宣告的異常型別。例如,java.io.IOException是一個檢查異常。要了解什麼是檢查異常,請考慮以下程式碼
程式碼部分 6.9:未處理的異常。
public void ioOperation(boolean isResourceAvailable) {
if (!isResourceAvailable) {
throw new IOException();
}
}
|
此程式碼無法編譯,因為它可能會丟擲檢查異常。編譯錯誤可以透過兩種方法解決:透過捕獲異常並處理它,或者透過使用throws關鍵字宣告可以丟擲異常。
|
|
在 Java 類層次結構中,如果異常繼承自java.lang.Throwable,但不繼承自java.lang.RuntimeException或java.lang.Error,那麼它就是一個檢查異常。所有應用程式或業務邏輯異常都應該是檢查異常。
一個方法可能宣告它可以丟擲異常,但實際上它並沒有。儘管如此,呼叫者仍然必須處理它。檢查異常宣告具有多米諾骨牌效應。任何將使用先前方法的方法也將不得不處理檢查異常,依此類推。
因此,Java 程式語言的編譯器在編譯時透過分析每個方法體來檢查程式是否包含所有應用程式異常的處理程式。如果透過執行方法體,可以將異常丟擲給呼叫者,則必須宣告該異常。編譯器如何知道方法體是否可以丟擲異常?這很簡單。在方法體內部,對其他方法有呼叫;編譯器檢視每個方法簽名,它們宣告要丟擲的異常。
為什麼要強制異常處理?
[edit | edit source]這可能看起來對開發人員很無聊,但它迫使他們考慮所有檢查異常並提高程式碼質量。這種在編譯時檢查異常處理程式的存在是為了讓應用程式開發人員的生活更輕鬆。除錯某個丟擲的異常是否有一個匹配的捕獲將是一個漫長的過程。在像 C 和 C++ 這樣的傳統語言中,需要單獨的錯誤處理除錯。在 Java 中,我們可以確定,當丟擲應用程式異常時,該異常在程式中的某個地方會被處理。在 C 和 C++ 中,這必須經過測試。在 Java 中,不需要測試,因此節省下來的時間可以用於更重要的測試,例如測試業務功能。
重寫方法時可以宣告哪些異常?
[edit | edit source]在throws關鍵字後指定的檢查異常類是實現者和使用者之間的契約的一部分。重寫方法可以宣告相同的異常、子類或無異常。
實現介面時可以宣告哪些異常?
[edit | edit source]JAVA 1.8 及更高版本:當涉及介面時,實現宣告可以跳過 throws 子句,但如果希望使用它,則應與介面宣告相容。換句話說,實現應該丟擲已宣告的異常或它的子型別,或者沒有異常。
Java 1.8 之前:實現者必須宣告相同的異常或它的子類。
