我想了解更多關於基本Java和不同類型的Throwables,有人可以讓我知道異常和錯誤之間的區別嗎?異常和錯誤之間的區別
回答
錯誤不應被發現或處理(除了最罕見的情況)。例外是異常處理的麪包和黃油。該Javadoc解釋說得好:
一個錯誤是Throwable的子類,表示嚴重的問題,一個 合理的應用程序不應該試圖捕獲。大多數這樣的錯誤是 條件異常。
看幾的Error
的子類,以他們的一些JavaDoc註釋:
AnnotationFormatError
- 當註釋分析器試圖從類文件讀取註釋並確定註釋時拋出是畸形的。AssertionError
- 拋出以指示斷言失敗。LinkageError
- LinkageError的子類表明一個類對另一個類有一些依賴關係;然而,後一類在編寫前一類後變得不相適應。VirtualMachineError
- 拋出以表明Java虛擬機已損壞或已耗盡其所需的資源以繼續運行。
有真正的Throwable
三個重要子類:
Error
- 這足夠嚴重的已經錯了大多數應用程序崩潰,而不是試圖來處理這個問題,- 未經檢查的異常(又名
RuntimeException
) - 經常出現編程錯誤,如NullPointerException
或非法參數。應用程序有時可以處理或從這個Throwable
類別中恢復 - 或者至少在Thread的run()
方法中捕獲它,記錄投訴並繼續運行。 - 的Checked Exception(又名其他的一切) - 應用程序預計將能夠趕上和有意義的做一些事情,其餘的,如
FileNotFoundException
和TimeoutException
...
錯誤往往會顯示你的應用程序的結束如你所知。它通常無法從中恢復,並應導致您的虛擬機退出。捕捉它們不應該完成,除了在退出之前可能記錄或顯示適當的消息。
示例: OutOfMemoryError - 由於您的程序無法再運行,因此無法執行任何操作。
異常通常是可恢復的,即使沒有異常,它們通常只是意味着嘗試的操作失敗,但您的程序仍然可以繼續。
例子: 拋出:IllegalArgumentException - 傳遞無效數據的方法,這樣的方法調用失敗,但它不會影響未來的行動。
這些都是簡單的例子,僅有例外就有很多信息。
一個錯誤是Throwable的 一個子類,表示嚴重的問題,一個 合理應用程序不應該試圖 趕上。
的Error
類的描述是相當清楚的:
的
Error
是Throwable
一個子類,表示嚴重的問題,一個 合理應用程序不應該試圖 趕上。大多數此類錯誤是 異常情況。ThreadDeath
錯誤,儘管「正常」的條件, 也是Error
的子類,因爲大多數 應用程序不應該試圖趕上 它。的方法不需要申報 其throws子句中的
Error
可能的 執行方法的過程中被拋出,但不是 抓到任何的子類,因爲這些錯誤是 從不 應該發生異常情況。
來自Java自己的documentation of the class Error
。
總之,你不應該趕上Error
s,除非你有充足的理由這樣做。 (例如,爲了防止在servlet運行內存不足或類似情況時執行web服務器崩潰)
另一方面,Exception
與其他任何現代語言一樣都是正常的例外。您將在Java API文檔或任何聯機或脫機資源中找到詳細的說明。
下面是從Java API的一個很好的總結什麼錯誤和異常表示:
一個錯誤是Throwable的子類,表示嚴重的問題,合理的應用程序不應該試圖捕獲。大多數此類錯誤都是異常情況。 ThreadDeath錯誤雖然是一個「正常」條件,但也是Error的一個子類,因爲大多數應用程序不應該試圖捕獲它。
的方法不需要申報 其throws子句中可能的 執行方法的過程中被拋出,但不是 抓住 錯誤的任何子類,因爲這些錯誤是 從不 應該發生異常情況。
OTOH,爲例外,Java API的說:
的Exception類及其子類是Throwable的一種形式,它指出的條件合理的應用程序想要捕獲的。
IMO錯誤是可能導致您的應用程序失敗,不應處理的錯誤。例外情況會導致不可預知的結果,但可以從中恢復。
實施例:
如果一個程序已用完的存儲器是錯誤作爲應用程序不能繼續。但是,如果程序接受不正確的輸入類型,則程序可以處理它並重定向以接收正確的輸入類型,這是一個例外。
錯誤主要是由運行應用程序的環境引起的。例如,當JVM內存不足時發生OutOfMemoryError,或者當堆棧溢出時發生StackOverflowError。
異常主要是由應用程序本身引起的。例如,當應用程序嘗試訪問空對象時發生NullPointerException,或者當應用程序嘗試轉換不兼容的類類型時發生ClassCastException。
有幾個相似性和類java.lang.Exception
和java.lang.Error
之間的差異。
相似點:
首先 - 兩個類延伸
java.lang.Throwable
並且作爲結果 繼承很多都是常見的有錯誤,如處理 時所使用的方法:getMessage
,getStackTrace
,printStackTrace
如 等。其次,作爲
java.lang.Throwable
是子類它們都繼承 以下屬性:Throwable的本身及其任何亞類(包括
java.lang.Error
)的可使用throws
關鍵字方法例外列表中聲明。這種聲明只需要java.lang.Exception
和子類,java.lang.Throwable
,java.lang.Error
和java.lang.RuntimeException
及其子類是可選的。只有
java.lang.Throwable
和子類允許在catch
子句中使用。只有
java.lang.Throwable
和子類可以使用關鍵字 -throw
。
從這個屬性的結論是以下兩者java.lang.Error
和java.lang.Exception
可以在方法頭被聲明,可以在catch
子句,可以用關鍵字throw
使用。
差異:
首先 - 概念上的差異:
java.lang.Error
設計爲 由JVM拋出,並指出嚴重的問題,並打算停止 程序執行的,而不是被抓(但它是可能的對於 任何其他java.lang.Throwable
後繼者)。從javadoc描述的通道約
java.lang.Error
:...表示嚴重的問題,一個合理的應用程序應該 不要試圖捕捉。
在相反
java.lang.Exception
設計成表示的錯誤, 預期並且可以由程序員不終止 程序執行處理。從javadoc描述的通道約
java.lang.Exception
:...指示合理的應用程序可能要 捕捉條件。
java.lang.Error
和java.lang.Exception
之間的第二個不同在於第一認爲是未經檢查例外編譯時異常檢查。由於結果代碼拋出java.lang.Error
或其子類不需要在方法頭中聲明此錯誤。同時在方法頭中拋出java.lang.Exception
所需的聲明。
這slide showing Java's exception hierarchy由@georgios-gousios簡潔地解釋了Java中的錯誤和異常之間的區別。
Errors -
Error
S IN的java是java.lang.Error
類型。- java中的所有錯誤都是未經檢查的類型。
Error
s在運行時發生。編譯器不會知道它們。- 從錯誤中恢復是不可能的。
Error
s主要是由運行應用程序的環境引起的。- 實例:
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Exception
S IN的java是java.lang.Exception
類型。Exception
s包括檢查以及未檢查類型。- 編譯器已知檢查異常,因爲編譯器不知道未檢查的異常,因爲它們在運行時發生。
- 您可以通過在
try-catch
塊中處理例外來恢復異常。 Exception
s主要是由應用程序本身引起的。- 例子:檢查異常:
SQLException
,IOException
unchecked異常:ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
進一步閱讀:http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
- 1. 異常和錯誤之間的區別?
- 2. 「拋出新異常」和「新異常」之間的區別?
- 3. C++異常和結構化異常之間的區別
- 4. object_id和常規ID之間的區別
- 5. Laravel 5.1 - 拋出異常和中止之間的區別()
- 6. 調用sys.exit()和拋出異常之間的區別
- 7. 錯誤與java中未經檢查的異常之間的區別?
- 8. 錯誤與異常有什麼區別?
- 9. 錯誤與失敗之間的區別
- 10. 投擲和投擲之間有什麼區別異常
- 11. 之間的〜/和的區別../
- 12. Javascript中的錯誤和異常有什麼區別
- 13. '#','%'和'$'之間的區別
- 14. {!!之間的區別!!}和{{}}
- 15. '+ ='和'= +'之間的區別?
- 16. 「。+」和「。+?」之間的區別
- 17. .eq之間的區別。和==
- 18. #。/和#之間的區別。 ./
- 19. !=和!之間的區別==
- 20. 「%〜dp0」和「。\」之間的區別?
- 21. | =和^ = css之間的區別
- 22. 之間的區別。和#
- 23. ==和case之間的區別?
- 24. 「**/* /」和「** /」之間的區別?
- 25. jQuery - '。'之間的區別和「#」
- 26. 「?1」和「?」之間的區別
- 27. `%in%`和`==`之間的區別
- 28. fmod和%之間的區別
- 29. 之間的區別:+和:+
- 30. 未經檢查的異常或運行時異常之間的區別
甲骨文說,'未檢查異常= RuntimeExceptions`;! `未經檢查的異常= RuntimeExceptions +錯誤`。我知道這引發了一個問題:*錯誤是一個例外嗎?*,但這是他們寫的。以下是其中一個示例:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html。 – 2016-05-14 15:02:22