爲什麼有運行時異常未檢查(而不是如果他們是檢查)?爲什麼運行時異常在Java中「未選中」?
回答
如果你沒有,你每次訪問一個數組元素時都必須有try/catch塊,做了一個除法操作和許多其他的常見場景。
換一種方式,想象一下這個代碼:
Map map = ...
int i = ...
(int[])map.get("foo")[3] = 2334/i;
必須檢查ClassCastException
,ArrayIndexOutofBoundsException
,ArithmeticException
,UnsupportedOperationException
和NullPointerException
,就在我的頭頂。
與Java的問題不是未經檢查的例外。檢查異常是一個極具爭議的主題。有人說這主要是Java的一個實驗,實際上它們不起作用,但你會發現很多人認爲它們很好。
然而,沒有人認爲未檢查的異常是不好的。
這只是表示編譯器不會強制您查找異常,但您仍然可以在運行時將其拋出。作爲一個好處,這允許您從您的類中拋出新的異常,而無需更改接口,導致調用者更改其代碼。
Java中兩種異常(已選中和未選中)的想法是,檢查異常應該用於可合理預期會發生的錯誤狀況,而未檢查異常應該用於意外錯誤情況。
例如,如果找不到文件,您將得到FileNotFoundException
,並且期望程序能夠處理這種情況是合理的。未經檢查的異常只應用於不應該發生的問題,並且這真的意味着如果發生這樣的問題,程序中存在一個錯誤。例如,NullPointerException
意味着您的程序試圖取消引用null
的變量,這很可能是一個錯誤。
Java編譯器強制程序員處理檢查的異常。這使編程語言更安全 - 這意味着程序員不得不考慮錯誤條件,這應該使程序更健壯。
編譯器不會檢查未經檢查的異常,因爲未經檢查的異常不應該發生,如果他們這樣做,那麼程序在運行時可以合理地執行任何操作;程序員必須解決這個錯誤。
在Java中這個功能一直受到一些批評,有些人甚至從Java調用了檢查異常a failed experiment和一些人propose to remove checked exceptions。
+1整潔的描述。 – Reuben 2011-08-09 09:52:54
- 1. 爲什麼運行時異常是未經檢查的異常?
- 2. java中最常用的運行時異常是什麼?
- 3. Nullpointer異常java運行時
- 4. Java運行時異常
- 5. java hibernate運行時異常
- 6. java中有什麼異常?
- 7. 爲什麼在運行單元測試時出現invalidArgument異常?
- 8. 在Python中,爲什麼這行從文件運行(沒有例外),但在shell中運行時拋出異常?
- 9. 在Java中,爲什麼我們有兩種類型的異常選中和未選中。
- 10. Java運行時異常。 Java FX
- 11. 最常見的選中和未選中的Java異常?
- 12. 在PHP中捕獲運行時異常
- 13. 在android中獲取運行時異常
- 14. 爲什麼此異常不會導致運行時錯誤?
- 15. 運行時異常沒有編譯錯誤。爲什麼?
- 16. 爲什麼FileProvider.getUriForFile導致運行時異常
- 17. 爲什麼運行JPA時會出現此異常?
- 18. 爲什麼我收到此運行時異常?
- 19. 「爲什麼運行時異常是不可恢復的?」
- 20. onPostExecute未在AsyncTask中調用(處理程序運行時異常)
- 21. 爲什麼TSQLT在SQLTest中出錯並在手動運行時未運行?
- 22. 什麼是Java中的「運行時類」?
- 23. 爲什麼在SharpGL.dll中發生異常?
- 24. 爲什麼[[]] [0] ++可以運行,但是[] ++會拋出運行時異常?
- 25. 在Java中處理運行時異常的正確方法
- 26. 在Java中運行遞歸程序時出現越界異常
- 27. 運行時異常(Java版本問題)
- 28. Java Jar地獄運行時異常
- 29. MongoDB運行時異常Java查詢
- 30. 爲什麼在BackgroundWorker DoWork例程中未捕獲異常?
「沒有人認爲未經檢查的例外情況不好,但是」 - 你會感到驚訝:-)然而,在所有其他方面都是+1。 – ChssPly76 2009-11-01 04:32:25
感謝@cletus。 – Moeb 2009-11-01 04:47:16
事實上,如果運行時異常被檢查,它將很難處理異常,因爲幾乎你可以在catch塊中做的任何事情都可能導致新的運行時異常,而這又必須被處理... – 2009-11-01 09:48:40