Throwable和 Error, RuntimeException, Exception的區別

https://blog.csdn.net/cloudeagle_bupt/article/details/45419867

Java語言要求java程序中(無論是誰寫的代碼)所有拋出(throw)的異常都必須是從Throwable派生而來。當然,實際的Java編程中,由於JDK平臺已經爲我們設計好了非常豐富和完整的異常對象分類模型。因此,java程序員一般是不需要再重新定義自己的異常對象。而且即便是需要擴展自定義的異常對象,也往往會從Exception派生而來。所以,對於java程序員而言,它一般只需要在它的頂級函數中catch(Exception ex)就可以捕獲出所有的異常對象。 所有異常對象的根基類是 Throwable ,Throwable從Object直接繼承而來(這是java系統所強制要求的),並且它實現了 Serializable接口(這爲所有的異常對象都能夠輕鬆跨越Java組件系統做好了最充分的物質準備)。從Throwable直接派生出的異常類有Exception和Error 。Exception是java程序員所最熟悉的,它一般代表了真正實際意義上的異常對象的根基類。也即是說, Exception 和從它派生而來的所有異常都是應用程序能夠catch到的,並且可以進行異常錯誤恢復處理的異常類型。而Error則表示Java系統中出現了一個非常嚴重的異常錯誤,並且這個錯誤可能是應用程序所不能恢復的,例如LinkageError ,或 ThreadDeath 等。

 

 
Error 和 RuntimeException 的子類是 unchecked 的,也就是不需要明確地 throws Error 也能編譯通過。

RuntimeException 表示這種異常是否出現經常不可預料,出現了的話,就中止處理。
Error 一般表示無法恢復的故障,也就是你再試一次依然會出錯,比如 OutOfMemoryError,試多少次很大概率出錯的。
Exception 則表示一般性的異常,而且這種異常是設計中早已考慮到很常見的錯誤,並且一定要求在設計中說明如果處理這種異常。

RuntimException 更接近我們日常生活中的“意外”。
Exception 這個更接近我們日常生活中所說的“常見錯誤”。
Error 更像是”見鬼,看來週末國慶不加班是搞不定的“。

技術上講,Error/RuntimeException 和 Exception 僅是 unchecked 和 checked 這種編譯過程上不同,它們的主要區別還是在設計時它的重要程序及處理例程。

就好像有時候,我們在說一句話是,說成 A->B 和 B<-A 效果是不一樣的,表明上它們結果相同,但是充分還是必要還是充要是不一樣的,我們不能因爲一個需求實現很複雜而選擇了一個變通的方法的時候把這個變通說成的需求,這種混淆我在別人的代碼中發現相當多這樣的錯誤,讓程序多了很多的 bug.

Throwable是java.lang包中一個專門用來處理異常的類。它有兩個子類,即Error 和Exception,它們分別用來處理兩組異常。 
Error用來處理程序運行環境方面的異常,比如,虛擬機錯誤、裝載錯誤和連接錯誤,這類異常主要是和硬件有關的,而不是由程序本身拋出的。 

Exception是Throwable的一個主要子類。Exception下面還有子類,其中一部分子類分別對應於Java程序運行時常常遇到的各種異常的處理,其中包括隱式異常。比如,程序中除數爲0引起的錯誤、數組下標越界錯誤等,這類異常也稱爲運行時異常,因爲它們雖然是由程序本身引起的異常,但不是程序主動拋出的,而是在程序運行中產生的。

 

Exception 子類下面的另一部分子類對應於Java程序中的非運行時異常的處理(在下圖中將它們直接屬於Exception了),這些異常也稱爲顯式異常。它們都是在程序中用語句拋出、並且也是用語句進行捕獲的,比如,文件沒找到引起的異常、類沒找到引起的異常等。 
一些主要子類對應的異常處理功能簡要說明如下: 
ArithmeticException——由於除數爲0引起的異常; 
ArrayStoreException——由於數組存儲空間不夠引起的異常; 
ClassCastException—一當把一個對象歸爲某個類,但實際上此對象並不是由這個類 創建的,也不是其子類創建的,則會引起異常; 
IllegalMonitorStateException——監控器狀態出錯引起的異常; 
NegativeArraySizeException—一數組長度是負數,則產生異常; 
NullPointerException—一程序試圖訪問一個空的數組中的元素或訪問空的對象中的 方法或變量時產生異常; 
OutofMemoryException——用new語句創建對象時,如系統無法爲其分配內存空 間則產生異常; 
SecurityException——由於訪問了不應訪問的指針,使安全性出問題而引起異常; 
IndexOutOfBoundsExcention——由於數組下標越界或字符串訪問越界引起異常; 
IOException——由於文件未找到、未打開或者I/O操作不能進行而引起異常; 
ClassNotFoundException——未找到指定名字的類或接口引起異常; 
CloneNotSupportedException——一程序中的一個對象引用Object類的clone方法,但 此對象並沒有連接Cloneable接口,從而引起異常; 
InterruptedException—一當一個線程處於等待狀態時,另一個線程中斷此線程,從 而引起異常,有關線程的內容,將在下一章講述; 
NoSuchMethodException一所調用的方法未找到,引起異常; 
Illega1AccessExcePtion—一試圖訪問一個非public方法; 
StringIndexOutOfBoundsException——訪問字符串序號越界,引起異常; 
ArrayIdexOutOfBoundsException—一訪問數組元素下標越界,引起異常; 
NumberFormatException——字符的UTF代碼數據格式有錯引起異常; 
IllegalThreadException—一線程調用某個方法而所處狀態不適當,引起異常; 
FileNotFoundException——未找到指定文件引起異常; 
EOFException——未完成輸入操作即遇文件結束引起異常。


 

Error類和Exception類的父類都是throwable類,他們的區別是:

Error類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。對於這類錯誤的導致的應用程序中斷,僅靠程序本身無法恢復和和預防,遇到這樣的錯誤,建議讓程序終止。

Exception類表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該儘可能處理異常,使程序恢復運行,而不應該隨意終止異常。

Exception類又分爲運行時異常(Runtime Exception)和受檢查的異常(Checked Exception ),運行時異常;ArithmaticException,IllegalArgumentException,編譯能通過,但是一運行就終止了,程序不會處理運行時異常,出現這類異常,程序會終止。而受檢查的異常,要麼用try。。。catch捕獲,要麼用throws字句聲明拋出,交給它的父類處理,否則編譯不會通過。

錯誤和異常的區別(Error vs Exception)  今天面試問了這樣一個問題,"Error" 和 "Exception"之間有啥區別?我覺得挺有意思,但是似乎又不能脫口而出。查找了一番資料之後,稍微總結了一下。 1)  error都是繼承自父類java.lang.Error,而exception都繼承自java.lang.Exception.

2)  再看看JDK中對於java.lang.Error和java.lang.Exception的解釋。     java.lang.Error: An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. 即:Error是Throwable的子類,用於標記嚴重錯誤。合理的應用程序不應該去try/catch這種錯誤。絕大多數的錯誤都是非正常的,就根本不該出現的。     java.lang.Exception: The class Exception and its subclasses are a form of Throwable that indicates conditions that a reasonable application might want to catch. 即Exception 是Throwable的一種形式的子類,用於指示一種合理的程序想去catch的條件。即它僅僅是一種程序運行條件,而非嚴重錯誤,並且鼓勵用戶程序去catch它。 3)  Error和RuntimeException 及其子類都是未檢查的異常(unchecked exceptions),而所有其他的Exception類都是檢查了的異常(checked exceptions). checked exceptions: 通常是從一個可以恢復的程序中拋出來的,並且最好能夠從這種異常中使用程序恢復。比如FileNotFoundException, ParseException等。 unchecked exceptions: 通常是如果一切正常的話本不該發生的異常,但是的確發生了。比如ArrayIndexOutOfBoundException, ClassCastException等。從語言本身的角度講,程序不該去catch這類異常,雖然能夠從諸如RuntimeException這樣的異常中catch並恢復,但是並不鼓勵終端程序員這麼做,因爲完全沒要必要。因爲這類錯誤本身就是bug,應該被修復,出現此類錯誤時程序就應該立即停止執行。 因此,面對Errors和unchecked exceptions應該讓程序自動終止執行,程序員不該做諸如try/catch這樣的事情,而是應該查明原因,修改代碼邏輯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章