有沒有人知道爲什麼重寫過程重寫的方法必須拋出重寫的方法的同一類型(或子類型)的異常,而另一方面,對於構造函數它的工作方式相反(因此,必須拋出同樣的異常或超扔什麼的超類型。 非常感謝提前。異常構造函數與異常Java
1
A
回答
4
構造函數沒有覆蓋他們的父類的構造函數,但他們呼叫超類的構造函數,或隱或顯。因此,就像調用其他方法拋出一個Exception
的方法一樣,構造函數必須捕獲超類的構造函數拋出的異常, st聲明它會拋出相同的異常(或該異常的超類)。
另一方面,重寫方法必須堅持超類的方法定義。因此,它可以拋出一個更具體的例外,或根本沒有。但它不能拋出更廣泛的例外,因爲這會違反超類的合同。
0
我相信對子類構造函數沒有這樣的限制。他們可以拋出他們關心的任何類型的異常,與超類構造函數拋出的類型無關。顯然,如果他們讓超類構造函數通過一個異常,他們將不得不聲明它或它的超類型,就像使用其他方法一樣。但是,這不是對子類構造函數的具體限制:通過拋出其他類型,您可以輕鬆地捕獲並處理異常。
原因是爲什麼子類中的構造函數沒有「重寫」超類中的構造函數,並且沒有以方式多態使用。這是一個獨立的事物,就像一個名爲Subclass.B()
的函數獨立於Superclass.A()
。
還有你總是知道當你打電話給new Subclass()
時,你就調用了這個構造函數。而如果你有一個Superclass
的參考,並且打電話給superclass.overriddenMethod()
,你不能確定這個類型是什麼。因此,覆蓋該方法的任何子類都不能拋出除超類上聲明的異常以外的任何其他異常,它們可能會更改方法簽名的其餘部分。
0
在構造函數中總是會有一個(可能是隱含的)超級調用。 拋出一個超類Exception也會捕獲這個。
public B() {
... initialize fields declared with X x = ...;
... call super constructor
... body of constructor
}
一個最重要的方法但是可以更具體,也爲例外:降低的可能性。
相關問題
- 1. 構造函數和異常
- 2. 構造函數中的異常,java
- 3. 異常異常構造
- 4. 統一參數構造函數異常
- 5. 處理構造函數的異常
- 6. 構造函數和拋出異常
- 7. ServerSocket的構造函數拋出異常
- 8. 在構造函數中捕獲異常
- 9. NullPointerException異常的構造函數定義
- 10. 從構造函數中拋出異常
- 11. PHP從構造函數rethrow異常
- 12. 如何捕獲構造函數異常?
- 13. REST異常需要構造函數
- 14. EJB3構造函數拋出異常?
- 15. 構造函數返回值的異常
- 16. Angular2,構造函數DI拋出異常
- 17. 異常處理和構造函數
- 18. RAII和構造函數中的異常
- 19. 從構造函數調用構造函數並捕獲異常
- 20. 異常構造類
- 21. 運行析構函數,當構造函數拋出異常
- 22. 通過__init__構造對象並忽略構造函數異常
- 23. C++析構函數異常
- 24. 異常與Java數據結構
- 25. Java自定義異常類的構造函數
- 26. 構造函數處理異常並使用此關鍵字Java
- 27. Java異常getMessage()方法調用構造函數
- 28. Java:從超級構造函數捕獲異常
- 29. 在java中的自定義異常的超類構造函數
- 30. 默認構造函數拋出異常java
這是不正確的。所以這個問題沒有意義。子類構造函數不會覆蓋其超類構造函數。它稱之爲。 – 2013-03-08 17:04:29