Java把異常當作對象來處理,並定義一個基類java.lang.Throwable做爲全部異常的超類。Java中的異常分爲兩大類:錯誤Error和異常Exception,Java異常體系結構以下圖所示:java
Throwable類是全部異常或錯誤的超類,它有兩個子類:Error和Exception,分別表示錯誤和異常。其中異常Exception分爲運行時異常(RuntimeException)和非運行時異常,也稱之爲不檢查異常(Unchecked Exception)和檢查異常(Checked Exception)。數組
通常是指java虛擬機相關的問題,如系統崩潰、虛擬機出錯誤、動態連接失敗等,這種錯誤沒法恢復或不可能捕獲,將致使應用程序中斷,一般應用程序沒法處理這些錯誤,所以應用程序不該該捕獲Error對象,也無須在其throws子句中聲明該方法拋出任何Error或其子類。多線程
一般,Java的異常(包括Exception和Error)分爲可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)。
可查異常(編譯器要求必須處置的異常):正確的程序在運行中,很容易出現的、情理可容的異常情況。可查異常雖然是異常情況,但在必定程度上它的發生是能夠預計的,並且一旦發生這種異常情況,就必須採起某種方式進行處理。
除了RuntimeException及其子類之外,其餘的Exception類及其子類都屬於可查異常。這種異常的特色是Java編譯器會檢查它,也就是說,當程序中可能出現這類異常,要麼用try-catch語句捕獲它,要麼用throws子句聲明拋出它,不然編譯不會經過。
不可查異常(編譯器不要求強制處置的異常):包括運行時異常(RuntimeException與其子類)和錯誤(Error)。ide
若是使用throw在方法體中拋出可查異常,則須要在方法頭部聲明方法可能拋出的異常類型。程序會在throw語句後當即終止,它後面的語句執行不到,而後在包含它的全部try塊中(可能在上層調用函數中)從裏向外尋找含有與其匹配的catch子句的try塊。函數
(1)運行時異常都是RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException等,這些異常是不檢查異常,程序中能夠選擇捕獲處理,也能夠不處理。這些異常通常是由程序邏輯錯誤引發的,程序應該從邏輯角度儘量避免這類異常的發生。spa
當出現RuntimeException的時候,咱們能夠不處理。當出現這樣的異常時,老是由虛擬機接管。好比:咱們歷來沒有人去處理過NullPointerException異常,它就是運行時異常,而且這種異常仍是最多見的異常之一。
出現運行時異常後,若是沒有捕獲處理這個異常(即沒有catch),系統會把異常一直往上層拋,一直到最上層,若是是多線程就由Thread.run()拋出,若是是單線程就被main()拋出。拋出以後,若是是線程,這個線程也就退出了。若是是主程序拋出的異常,那麼這整個程序也就退出了。運行時異常是Exception的子類,也有通常異常的特色,是能夠被catch塊處理的。只不過每每咱們不對他處理罷了。也就是說,你若是不對運行時異常進行處理,那麼出現運行時異常以後,要麼是線程停止,要麼是主程序終止。
若是不想終止,則必須捕獲全部的運行時異常,決不讓這個處理線程退出。隊列裏面出現異常數據了,正常的處理應該是把異常數據捨棄,而後記錄日誌。不該該因爲異常數據而影響下面對正常數據的處理。線程
(2)非運行時異常是RuntimeException之外的異常,類型上都屬於Exception類及其子類。如IOException、SQLException等以及用戶自定義的Exception異常。對於這種異常,JAVA編譯器強制要求咱們必需對出現的這些異常進行catch並處理,不然程序就不能編譯經過。因此,面對這種異常無論咱們是否願意,只能本身去寫一大堆catch塊去處理可能的異常。日誌
來看看下面這個test1()方法:對象
public int test1() { try { return 1; } finally { return 2; } }
方法test1將返回2;blog
怎麼解釋呢?再來看看下面這個test2()方法:
public int test2() { int i = 1; try { System.out.println("try語句塊中"); return 1; } finally { System.out.println("finally語句塊中"); return 2; } }
運行結果是:
try語句塊中
finally語句塊中
2
從運行結果中能夠發現,try中的return語句調用的函數先於finally中調用的函數執行,也就是說return語句先執行,finally語句後執行,因此,返回的結果是2。return並非讓函數立刻返回,而是return語句執行後,將把返回結果放置進函數棧中,此時函數並非立刻返回,它要執行finally語句後才真正開始返回。
ArrayStoreException 試圖將錯誤類型的對象存儲到一個對象數組時拋出的異常
ClassCastException 試圖將對象強制轉換爲不是實例的子類時,拋出該異常
IllegalArgumentException 拋出的異常代表向方法傳遞了一個不合法或不正確的參數
IndexOutOfBoundsException 指示某排序索引(例如對數組、字符串或向量的排序)超出範圍時拋出
NoSuchElementException 代表枚舉中沒有更多的元素
NullPointerException 當應用程序試圖在須要對象的地方使用 null 時,拋出該異常
java.io.NotSerializableException 代表序列化或反序列化時出錯
java.util.ConcurrentModificationException 集合遍歷快速失敗