構造函數中的例外
回答
該對象存在,但尚未正確初始化。
只要this
在施工期間泄漏(不只是當您拋出異常)時,就會發生這種情況。
這是一個非常有問題的情況,因爲一些通常假定的擔保在這種情況下不成立(例如final
字段在施工期間看起來可能會改變它們的值)。
因此,您應該避免在構造函數中泄漏this
。
This IBM developerWorks article描述了在構建對象時採取的預防措施以及這些預防措施背後的推理。雖然本文根據多線程討論了該主題,但在構建期間未知/不可信代碼獲取對this
的引用時,單線程環境中可能會出現類似問題。
你不應該在構造函數中像打開文件一樣打開資源。改爲創建一個init方法,然後從那裏執行。那麼你很安全。
*「那麼你很安全」*。那聲明顯然是假的!在構造函數中可能會導致異常的其他事物有**許多**;例如非法參數,NPE,數組索引等,甚至堆棧溢出或內存不足錯誤。 – 2010-04-14 10:44:06
這是很好的建議,但也有其他情況下你可能想要一個構造函數失敗。例如,我想要一個並行迭代器,如http://stackoverflow.com/questions/3137944/best-way-to-iterate-over-two-lists-simultaneously,所以我想檢查列表是相同的大小在施工時間。 – 2013-02-08 04:08:49
此代碼不是異常安全的,在C++中也不是異常安全的。無論您使用哪種語言,都是同樣的錯誤。
- 1. 來自Tracker afterFlush函數的例外:fabric.Canvas不是構造函數
- 2. 如何在構造函數外訪問構造函數的值
- 3. C#實例構造函數與靜態構造函數
- 4. AS3函數內部構造函數與函數外部構造函數
- 5. 構造函數中的調用基構造函數和其他構造函數
- 6. 析構函數中的例外
- 7. 構造函數之外的變量實例與
- 8. 移動構造函數和強烈的例外保證
- 9. 超級外部構造函數的錯誤模態示例
- 10. Angular 2實例化構造函數之外的依賴注入
- 11. 朱利亞參數構造函數 - 外部構造函數的問題
- 12. 區分javascript構造函數的實例
- 13. 沒有構造函數的實例C++
- 14. JavaScript的使用案例構造函數
- 15. 數組,構造函數和實例
- 16. 構造函數中的單例函數調用vs方法
- 17. 單張控制編碼器 - 例外:「Nominatim不是構造函數」
- 18. LazyList.decorate - InstantiateFactory:構造函數必須存在,並且公開例外
- 19. 如何檢查構造函數失效,例外情況禁用
- 20. 在java中調用繼承構造函數的構造函數
- 21. 外部調用拷貝構造函數和析構函數
- 22. 實例化繼承構造函數
- 23. 實例變量和構造函數
- 24. 構造函數中的malloc
- 25. Python中的構造函數
- 26. webform中的構造函數?
- 27. 構造函數中的Actionlisteners
- 28. Swift中的構造函數
- 29. javascript中的構造函數
- 30. 斯卡拉:類構造函數ARGS外
+1 - 但在這種情況下「泄漏」被稱爲(不安全)「發佈」;例如在布洛赫。此外,這是一個好主意,更深入地解釋這一點。 – 2010-04-14 10:37:19