理解重寫方法異常聲明
在Java 中,當重寫子類中的方法時,重寫方法必須遵守有關拋出的某些規則例外。具體來說,重寫方法不能拋出新的或比重寫方法聲明的異常更廣泛的檢查異常。
例如,如果基底類別方法宣告拋出 FileNotFoundException,則子類別中的重寫方法不能拋出SQLException、Exception 或任何其他不是 FileNotFoundException 子類別的非執行時期例外。
推理限制的背後
這個限制源自於多態性原理和里氏替換原理(LSP)。 LSP 規定子類在所有情況下都應該可以替換其基類,以便程序行為保持正確。
如果允許重寫方法拋出更廣泛的異常,它將違反 LSP。例如,如果基底類別方法 foo() 宣告拋出 IOException,並且重寫方法宣告會拋出 SQLException,則編譯器將不再強制呼叫者處理 IOException。
但是,當子類被視為其基類,呼叫者可能不期望或不準備處理重寫方法引發的更廣泛的異常。這將導致運行時異常和不可預測的行為。
範例
考慮以下程式碼:
class A { public void foo() throws IOException {..} } class B extends A { @Override public void foo() throws SocketException {..} // allowed @Override public void foo() throws SQLException {..} // NOT allowed }
在此範例中,重寫方法類別B 中的SocketException 可以拋出SocketException,SocketException因為它是IOException 的子類別。但是,它不能拋出 SQLException,因為 SQLException 不是 IOException 的子類別。
未經檢查的異常
未經檢查的異常不受此限制。它們可以透過重寫方法拋出,無論它們是否在重寫方法的 throw 子句中聲明。
以上是子類別方法可以拋出比其超類別方法更廣泛的檢查異常嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!