2009-05-26 121 views

回答

128

錯誤不應被發現或處理(除了最罕見的情況)。例外是異常處理的麪包和黃油。該Javadoc解釋說得好:

一個錯誤是Throwable的子類,表示嚴重的問題,一個 合理的應用程序不應該試圖捕獲。大多數這樣的錯誤是 條件異常。

看幾的Error的子類,以他們的一些JavaDoc註釋:

  • AnnotationFormatError - 當註釋分析器試圖從類文件讀取註釋並確定註釋時拋出是畸形的。
  • AssertionError - 拋出以指示斷言失敗。
  • LinkageError - LinkageError的子類表明一個類對另一個類有一些依賴關係;然而,後一類在編寫前一類後變得不相適應。
  • VirtualMachineError - 拋出以表明Java虛擬機已損壞或已耗盡其所需的資源以繼續運行。

有真正的Throwable三個重要子類:

  • Error - 這足夠嚴重的已經錯了大多數應用程序崩潰,而不是試圖來處理這個問題,
  • 未經檢查的異常(又名RuntimeException ) - 經常出現編程錯誤,如NullPointerException或非法參數。應用程序有時可以處理或從這個Throwable類別中恢復 - 或者至少在Thread的run()方法中捕獲它,記錄投訴並繼續運行。
  • 的Checked Exception(又名其他的一切) - 應用程序預計將能夠趕上和有意義的做一些事情,其餘的,如FileNotFoundExceptionTimeoutException ...
+6

甲骨文說,'未檢查異常= RuntimeExceptions`;! `未經檢查的異常= RuntimeExceptions +錯誤`。我知道這引發了一個問題:*錯誤是一個例外嗎?*,但這是他們寫的。以下是其中一個示例:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html。 – 2016-05-14 15:02:22

16

錯誤往往會顯示你的應用程序的結束如你所知。它通常無法從中恢復,並應導致您的虛擬機退出。捕捉它們不應該完成,除了在退出之前可能記錄或顯示適當的消息。

示例: OutOfMemoryError - 由於您的程序無法再運行,因此無法執行任何操作。

異常通常是可恢復的,即使沒有異常,它們通常只是意味着嘗試的操作失敗,但您的程序仍然可以繼續。

例子: 拋出:IllegalArgumentException - 傳遞無效數據的方法,這樣的方法調用失敗,但它不會影響未來的行動。

這些都是簡單的例子,僅有例外就有很多信息。

7

puts it best

一個錯誤是Throwable的 一個子類,表示嚴重的問題,一個 合理應用程序不應該試圖 趕上。

3

Error類的描述是相當清楚的:

ErrorThrowable 一個子類,表示嚴重的問題,一個 合理應用程序不應該試圖 趕上。大多數此類錯誤是 異常情況。 ThreadDeath 錯誤,儘管「正常」的條件, 也是Error的子類,因爲大多數 應用程序不應該試圖趕上 它。

的方法不需要申報 其throws子句中的 Error可能的 執行方法的過程中被拋出,但不是 抓到任何的子類,因爲這些錯誤是 從不 應該發生異常情況。

來自Java自己的documentation of the class Error

總之,你不應該趕上Error s,除非你有充足的理由這樣做。 (例如,爲了防止在servlet運行內存不足或類似情況時執行web服務器崩潰)

另一方面,Exception與其他任何現代語言一樣都是正常的例外。您將在Java API文檔或任何聯機或脫機資源中找到詳細的說明。

0

下面是從Java API的一個很好的總結什麼錯誤和異常表示:

一個錯誤是Throwable的子類,表示嚴重的問題,合理的應用程序不應該試圖捕獲。大多數此類錯誤都是異常情況。 ThreadDeath錯誤雖然是一個「正常」條件,但也是Error的一個子類,因爲大多數應用程序不應該試圖捕獲它。

的方法不需要申報 其throws子句中可能的 執行方法的過程中被拋出,但不是 抓住 錯誤的任何子類,因爲這些錯誤是 從不 應該發生異常情況。

OTOH,爲例外,Java API的說:

的Exception類及其子類是Throwable的一種形式,它指出的條件合理的應用程序想要捕獲的。

0

IMO錯誤是可能導致您的應用程序失敗,不應處理的錯誤。例外情況會導致不可預知的結果,但可以從中恢復。

實施例:

如果一個程序已用完的存儲器是錯誤作爲應用程序不能繼續。但是,如果程序接受不正確的輸入類型,則程序可以處理它並重定向以接收正確的輸入類型,這是一個例外。

0

錯誤主要是由運行應用程序的環境引起的。例如,當JVM內存不足時發生OutOfMemoryError,或者當堆棧溢出時發生StackOverflowError。

異常主要是由應用程序本身引起的。例如,當應用程序嘗試訪問空對象時發生NullPointerException,或者當應用程序嘗試轉換不兼容的類類型時發生ClassCastException。

來源:Difference Between Error Vs Exception In Java

2

有幾個相似性和類java.lang.Exceptionjava.lang.Error之間的差異。

相似點:

  • 首先 - 兩個類延伸java.lang.Throwable並且作爲結果 繼承很多都是常見的有錯誤,如處理 時所使用的方法:getMessagegetStackTraceprintStackTrace如 等。

  • 其次,作爲java.lang.Throwable是子類它們都繼承 以下屬性:

    • Throwable的本身及其任何亞類(包括java.lang.Error)的可使用throws關鍵字方法例外列表中聲明。這種聲明只需要java.lang.Exception和子類,java.lang.Throwable,java.lang.Errorjava.lang.RuntimeException及其子類是可選的。

    • 只有java.lang.Throwable和子類允許在catch子句中使用。

    • 只有java.lang.Throwable和子類可以使用關鍵字 - throw

從這個屬性的結論是以下兩者java.lang.Errorjava.lang.Exception可以在方法頭被聲明,可以在catch子句,可以用關鍵字throw使用。

差異:

  • 首先 - 概念上的差異:java.lang.Error設計爲 由JVM拋出,並指出嚴重的問題,並打算停止 程序執行的,而不是被抓(但它是可能的對於 任何其他java.lang.Throwable後繼者)。

    javadoc描述的通道約java.lang.Error

    ...表示嚴重的問題,一個合理的應用程序應該 不要試圖捕捉。

    在相反java.lang.Exception設計成表示的錯誤, 預期並且可以由程序員不終止 程序執行處理。

    javadoc描述的通道約java.lang.Exception

    ...指示合理的應用程序可能要 捕捉條件。

  • java.lang.Errorjava.lang.Exception之間的第二個不同在於第一認爲是未經檢查例外編譯時異常檢查。由於結果代碼拋出java.lang.Error或其子類不需要在方法頭中聲明此錯誤。同時在方法頭中拋出java.lang.Exception所需的聲明。

Throwable及其後繼類圖(屬性和方法被省略)。 enter image description here

2

Errors -

  1. Error S IN的java是java.lang.Error類型。
  2. java中的所有錯誤都是未經檢查的類型。
  3. Error s在運行時發生。編譯器不會知道它們。
  4. 從錯誤中恢復是不可能的。
  5. Error s主要是由運行應用程序的環境引起的。
  6. 實例:java.lang.StackOverflowErrorjava.lang.OutOfMemoryError

Exceptions -

  1. Exception S IN的java是java.lang.Exception類型。
  2. Exception s包括檢查以及未檢查類型。
  3. 編譯器已知檢查異常,因爲編譯器不知道未檢查的異常,因爲它們在運行時發生。
  4. 您可以通過在try-catch塊中處理例外來恢復異常。
  5. Exception s主要是由應用程序本身引起的。
  6. 例子:檢查異常:SQLExceptionIOException
    unchecked異常:ArrayIndexOutOfBoundExceptionClassCastExceptionNullPointerException

進一步閱讀:http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

相關問題