什麼是運行時異常以及什麼是Checked/Unchecked Exceptions和Error/Exception之間的區別。爲什麼這些類型很多?相反,Java可以簡單地遵循一個簡單的設計(只是嘗試/捕獲所有類型)來處理程序中的異常情況?Runtime/Checked/Unchecked/Error/Exception之間的差異
回答
Throwable處於所有例外狀態。 Underneath Throwable你有錯誤和異常。 在異常下有RuntimeException。
Java有兩種類型的異常 - 選中和未選中。檢查異常是由編譯器執行的(你必須在throws子句中聲明它們並最終捕獲它們)。未檢查的異常不會強制捕獲或在throws子句中聲明。
(答案中有爭議的部分)
Throwable的存在,以便有所有的異常類型的父母。你永遠不應該聲明你拋出Throwable並且永遠不會捕獲它(除非你真的真的知道你在做什麼)。
指示運行時環境的問題存在錯誤,您的程序可能無法從中恢復,例如格式錯誤的類文件或內存不足的虛擬機。除非你真的知道你在做什麼,否則你不應該發現一個錯誤。
作爲所有非程序員錯誤的根存在異常(請參閱RuntimeException中的「異常」),例如由於磁盤已滿而無法創建文件。您不應該拋出,拋出或捕獲異常。如果你必須趕上例外,請確保你知道你在做什麼。
RuntimeException存在以指示所有程序員錯誤,例如超過數組末尾或調用空對象上的方法。這些是你應該修復的東西,以便它們不會拋出異常 - 表明你,程序員,搞砸了代碼。再說一遍,除非你知道你在做什麼,否則你不應該抓住這些。
@ TofuBeer的回答清楚地解釋了異常類的含義。
Why these many types? Instead Java may simply follow a simple design(just try/catch all types) to handle an abnormal condition in a program?
爲什麼?因爲他們是必要的!如果沒有這四類,處理大類的例外將是不切實際的。
- 如果沒有
Error
類,你會如何捕獲「所有致命的JVM錯誤」? - 如何在沒有
Exception
類的情況下捕獲「不是JVM致命錯誤的所有異常」? - 如果沒有
RuntimeException
課程,你會如何捕獲「所有未經檢查的例外」?
由於我是一名新的Java開發人員,因此在區分和處理不同類型的異常方面也面臨一些困難。這就是爲什麼我在這個話題上做了一個簡短的記錄,每當我感到困惑的時候,我都會通過它。在這裏它與所述Throwable
類層次的圖像:
[的JavaTpoint圖像禮貌]。
在這裏有三個關鍵類別要記住:Throwable
,Exception
和Error
。在這些類別中,Exception
可以分爲兩種類型:「檢查異常」和「未檢查異常」。
經過例外:
- 這些是延伸
Throwable
除了RuntimeException
和Error
的類。 - 它們也被稱爲編譯時異常,因爲它們在編譯時被檢查,這意味着編譯器迫使我們或者用
try/catch
來處理它們,或者在函數簽名中指示它們throws
它們並迫使我們在調用者中處理它們。 - 它們是由代碼控制之外的意外情況(例如數據庫故障,文件I/O錯誤,錯誤輸入等)引起的程序可恢復問題。
- 實施例:
IOException
,SQLException
等
未經檢查的異常:
- 延伸
RuntimeException
被稱爲未檢查異常的類。 - 在編譯時未檢查未檢查的異常,而是在運行時檢查,因此是名稱。
- 它們也是編程上可恢復的問題,但不像檢查異常它們是由代碼流或配置中的錯誤引起的。
- 實施例:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
等 - 由於它們的編程錯誤,它們可以通過很好地/明智編碼來避免。例如「除以零」產生一個
ArithmeticException
,這可以通過對除數的簡單檢查來避免。同樣,我們可以通過簡單檢查參考文獻if (object != null)
或甚至使用better techniques來避免NullPointerException
。
錯誤:
Error
是指沒有被一個try/catch
處理無法挽回的局面。- 例子:
OutOfMemoryError
,VirtualMachineError
,AssertionError
等
爲什麼這麼多的類型?
除了Stephen C的回答我想說的是: 異常處理是一個相對昂貴的Java操作。 我們不應該把所有異常情況放在try/catch
區塊。過度使用try/catch
可能會妨礙程序性能。
最後,Exception
應儘可能以編程方式處理。另一方面,我們不能處理Error
,所以這些可能是爲什麼有很多類型的例外的一些合乎邏輯的原因。
爲好的圖片+1。旁註:「錯誤」不可捕捉是不正確的。沒有人阻止你寫'try {sometching(); } catch(Error e){}',但這樣做確實是一個壞主意(詳情請參閱[@ TofuBeer的回答](https://stackoverflow.com/a/3162916/2448440))。 – Qw3ry 2017-09-01 07:49:34
- 錯誤(由虛擬機拋出,不應該被捕獲或處理)
- VM錯誤
- 斷言錯誤
- 鏈接錯誤......等等
- 運行/不選異常(編程錯誤,不應被捕獲或處理)
- NullPointerException異常
- ArrayIndexOutOfBoundException
- 拋出:IllegalArgumentException ......等等
- 檢查異常(別的,有望應用到被捕獲或處理)
- IOException異常
- FileNotFoundException異常
- 的SQLException ...等等
- 1. Serilog:之間{..} {差異@ ..}
- 2. /和/ **之間的差異
- 3. 兩次之間的差異
- 4. 差異之間的三個
- 5. PHP之間的差異()和[]
- 6. 行之間的Mysql差異
- 7. 行之間的差異
- 8. '//'和'///'之間的C++差異
- 9. SQL:行之間的差異
- 10. sqlite行之間的差異
- 11. 數組之間的差異
- 12. 日期之間的差異
- 13. 2天之間的差異
- 14. 日期之間的差異
- 15. VBA:&和+之間的差異
- 16. 之間的差異和::: ++
- 17. 數據之間的差異
- 18. 列之間的SQL差異以及列與NULL值之間的SQL差異
- 19. 運算符「==」和「=」之間的差異運算符「==」和「=」之間的差異「==」和「=」
- 20. PHP:差異之間 - >和::
- 21. 差異之間保持
- 22. 日期時間之間的差異
- 23. 時間戳。兩次之間的差異
- 24. 找到時間之間的差異c
- 25. 2時間戳之間的差異 - PHP
- 26. SQL中時間列之間的差異
- 27. 2個時間戳之間的差異
- 28. Joda時間 - 時區之間的差異
- 29. UTC時間值之間的差異scala
- 30. 以圖片之間的差異顯示差異
您是否閱讀過[Sun Java教程異常教程](http://java.sun.com/docs/books/tutorial/essential/exceptions/)?這可能是一個很好的開始。 – 2010-07-02 02:21:34