14

什麼是運行時異常以及什麼是Checked/Unchecked Exceptions和Error/Exception之間的區別。爲什麼這些類型很多?相反,Java可以簡單地遵循一個簡單的設計(只是嘗試/捕獲所有類型)來處理程序中的異常情況?Runtime/Checked/Unchecked/Error/Exception之間的差異

+0

您是否閱讀過[Sun Java教程異常教程](http://java.sun.com/docs/books/tutorial/essential/exceptions/)?這可能是一個很好的開始。 – 2010-07-02 02:21:34

回答

27

Throwable處於所有例外狀態。 Underneath Throwable你有錯誤和異常。 在異常下有RuntimeException。

Java有兩種類型的異常 - 選中和未選中。檢查異常是由編譯器執行的(你必須在throws子句中聲明它們並最終捕獲它們)。未檢查的異常不會強制捕獲或在throws子句中聲明。

(答案中有爭議的部分)

Throwable的存在,以便有所有的異常類型的父母。你永遠不應該聲明你拋出Throwable並且永遠不會捕獲它(除非你真的真的知道你在做什麼)。

指示運行時環境的問題存在錯誤,您的程序可能無法從中恢復,例如格式錯誤的類文件或內存不足的虛擬機。除非你真的知道你在做什麼,否則你不應該發現一個錯誤。

作爲所有非程序員錯誤的根存在異常(請參閱RuntimeException中的「異常」),例如由於磁盤已滿而無法創建文件。您不應該拋出,拋出或捕獲異常。如果你必須趕上例外,請確保你知道你在做什麼。

RuntimeException存在以指示所有程序員錯誤,例如超過數組末尾或調用空對象上的方法。這些是你應該修復的東西,以便它們不會拋出異常 - 表明你,程序員,搞砸了代碼。再說一遍,除非你知道你在做什麼,否則你不應該抓住這些。

3

@ 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課程,你會如何捕獲「所有未經檢查的例外」?
0

運行時異常爲您提供了避免捕獲,聲明異常的靈活性。

+2

是的,好像不捕捉異常,只是讓它殺死線程是一個可接受的解決方案。 – Bombe 2011-02-13 10:57:51

+0

在某些情況下,它是。 – Sid 2011-02-13 19:04:00

+0

它通常被認爲是一個糟糕的想法®來產生你自己的RuntimeException。小心這樣做,而不僅僅是一條捷徑。 – 2015-03-16 13:50:10

16

由於我是一名新的Java開發人員,因此在區分和處理不同類型的異常方面也面臨一些困難。這就是爲什麼我在這個話題上做了一個簡短的記錄,每當我感到困惑的時候,我都會通過它。在這裏它與所述Throwable類層次的圖像:
Throwable Class Hierarchy

[的JavaTpoint圖像禮貌]。

在這裏有三個關鍵類別要記住:Throwable,ExceptionError。在這些類別中,Exception可以分爲兩種類型:「檢查異常」和「未檢查異常」。

經過例外:

  • 這些是延伸Throwable除了RuntimeExceptionError的類。
  • 它們也被稱爲編譯時異常,因爲它們在編譯時被檢查,這意味着編譯器迫使我們或者用try/catch來處理它們,或者在函數簽名中指示它們throws它們並迫使我們在調用者中處理它們。
  • 它們是由代碼控制之外的意外情況(例如數據庫故障,文件I/O錯誤,錯誤輸入等)引起的程序可恢復問題。
  • 實施例:IOExceptionSQLException

未經檢查的異常:

  • 延伸RuntimeException被稱爲未檢查異常的類。
  • 在編譯時未檢查未檢查的異常,而是在運行時檢查,因此是名稱。
  • 它們也是編程上可恢復的問題,但不像檢查異常它們是由代碼流或配置中的錯誤引起的。
  • 實施例:ArithmeticExceptionNullPointerExceptionArrayIndexOutOfBoundsException
  • 由於它們的編程錯誤,它們可以通過很好地/明智編碼來避免。例如「除以零」產生一個ArithmeticException,這可以通過對除數的簡單檢查來避免。同樣,我們可以通過簡單檢查參考文獻if (object != null)或甚至使用better techniques來避免NullPointerException

錯誤:

  • Error是指沒有被一個try/catch處理無法挽回的局面。
  • 例子:OutOfMemoryErrorVirtualMachineErrorAssertionError

爲什麼這麼多的類型?

除了Stephen C的回答我想說的是: 異常處理是一個相對昂貴的Java操作。 我們不應該把所有異常情況放在try/catch區塊。過度使用try/catch可能會妨礙程序性能。

最後,Exception應儘可能以編程方式處理。另一方面,我們不能處理Error,所以這些可能是爲什麼有很多類型的例外的一些合乎邏輯的原因。

+0

爲好的圖片+1。旁註:「錯誤」不可捕捉是不正確的。沒有人阻止你寫'try {sometching(); } catch(Error e){}',但這樣做確實是一個壞主意(詳情請參閱[@ TofuBeer的回答](https://stackoverflow.com/a/3162916/2448440))。 – Qw3ry 2017-09-01 07:49:34

0
  • 錯誤(由虛擬機拋出,不應該被捕獲或處理)
    1. VM錯誤
    2. 斷言錯誤
    3. 鏈接錯誤......等等
  • 運行/不選異常(編程錯誤,不應被捕獲或處理)
    1. NullPointerException異常
    2. ArrayIndexOutOfBoundException
    3. 拋出:IllegalArgumentException ......等等
  • 檢查異常(別的,有望應用到被捕獲或處理)
    1. IOException異常
    2. FileNotFoundException異常
    3. 的SQLException ...等等