簡體   English   中英

接口和異常

[英]Interfaces and exceptions

我在tutorialspoint上閱讀有關接口的內容,發現以下內容:

“除了接口方法聲明的實現方法或接口方法聲明的方法的子類以外,不應在實現方法上聲明檢查的異常。”

誰能告訴我這到底是什么意思?

這意味着,如果我聲明的接口方法拋出了一些檢查過的異常E而不是某些客戶端代碼使用接口,則應顯式處理此檢查過的異常(通過try-catch或進一步拋出)。 而且,如果您嘗試在實現C的類C中聲明更多受檢查的異常(E1),則這將破壞應用程序的邏輯:I的客戶端不知道除E之外引發的異常。

實際上,編譯器不允許您這樣做

檢查異常是必須在可能引發異常的方法的類型簽名中聲明的異常。 引用的意思是,實現接口的類不應在其從接口實現的方法的簽名中添加任何檢查的異常。

因此,如果您有這樣的界面:

interface NoExceptions{
    void safeMethod();
}

禁止聲明這樣的類:

class UnsafeClass{
    @Override
    void safeMethod() throws IOException{}
}

由於它正在修改類型簽名。 相反,這些異常應在方法內部處理。

這是因為檢查異常的目的是確保調用代碼將處理可能發生的問題。 嘗試在子類中添加異常會刪除該安全性:

UnsafeClass uc = new UnsafeClass();
uc.safeMethod(); //Not allowed, because the exception is not handled
NoExceptions ne = uc;
ne.safeMethod(); //Becomes allowed, because the interface does not declare an exception

因此,禁止您添加此類異常。

但是,您可以編寫一個實現,該實現將引發在接口上聲明的已檢查異常的子類。 這將始終是安全的操作,因為子類可以用作其超類的直接替代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM