簡體   English   中英

Java異常來自何處?

[英]Where do Java exceptions came from?

到目前為止,我認為每個Java異常都必須由構造函數創建,因為我可以自己創建自定義異常:

throw new Exception();

但是現在看來,我必須處理JavaMail- MessagingException中的某些異常。 它來自Store.close方法(從Service類繼承)。

我去了那里(我需要檢查何時引發該異常,以便知道什么地方可能出了錯),並且我看到該方法調用了另外兩個方法-它們都不拋出異常!

public synchronized void close() throws MessagingException {
    setConnected(false);
    notifyConnectionListeners(ConnectionEvent.CLOSED);
}

據我了解,這是檢查的異常(Error和RuntimeException均未檢查),那么怎么可能不必在close方法命令使用的任何方法中都聲明它? 在此方法中,也不會在此處創建它。

聲明的異常實現可能引發的異常無關而是與該實現或子類 中的實現可能引發的異常有關。 Service是一個抽象類-JavaMail實現的兩個直接子類( TransportStore )也是如此。 即使這些覆蓋都不覆蓋close() ,您使用的具體實現也有可能覆蓋close()並且實現也可能拋出MessagingException

從API設計的角度來看有意義嗎? 我必須更仔細地研究JavaMail才能做出任何判斷,而且值得慶幸的是,我已經很長時間沒有使用JavaMail了。

從語言的角度來看有意義嗎? 絕對。 擁有一個不拋出特定檢查異常的實現,但是期望具體的子類可能需要這樣做是完全合理的。

關於方法聲明的JLS說

聲明檢查異常的要求使Java編譯器可以確保已包含用於處理此類錯誤情況的代碼。 如果方法或構造函數無法處理作為主體中的檢查異常引發的異常條件,則如果它們在throws子句中缺少適當的異常類型,通常會導致編譯時錯誤。 因此,Java編程語言鼓勵采用這種編程方式,在這種方式下,以這種方式記錄了罕見的條件,或者說是真正的例外情況。

基本上,如果沒有處理異常,則可以確保代碼不會編譯。 因此,即使未在此實現中拋出它,它也可能在子類中。

閱讀整頁以獲得更多詳細信息。

public class Mother{
    public foo() throws Exception{
         system.out.println("I am mother");
    }
}

public class Daughter extends Mother{

    @Override
    public foo() throws Exception{
         throws new Exception("I am a teenager !!");
    }
}

由於這是允許的

Mother m = new Daughter();

您松開了實例的真實類型,所以幸運的是,如果您這樣做,編譯器會尖叫

m.foo(); //will not compile

請注意,如果子類中被重寫的方法需要throws某些東西,那么您就無法從母親那里獲得沒有任何throws聲明的方法。 禁止,您不能在子類throws聲明中添加或使用異常的超類

暫無
暫無

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

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