從本質上來說,java異常是一個java對象(繼承Object),和通常的java對象同樣,封裝了一些成員變量和操做,咱們能夠向操做通常java對象那樣去操做java異常對象(我還特意去試了試可不可使用throw關鍵字操做通常的java對象,發現編譯錯誤,證實它僅僅是操做異常類的語法)java
從表明的含義上來講:java異常是一種錯誤狀況,是程序不但願出現的現象,可是因爲程序自己的設計邏輯和運行的環境等因素,出現異常的狀況不可避免,java虛擬機針對不一樣的異常狀況定義了不少異常類,當jvm運行程序發現對應的異常時,將會向外面拋出異常程序員
java提供了拋出異常捕獲異常的邏輯用於處理異常,當程序拋出異常時,若是不存在捕獲異常邏輯,正在執行的方法將中止執行,並將該異常向外拋出,調用該方法的程序進行一樣的處理,若是也沒有進行捕獲,則將一層一層的向外拋出,直到到達當前線程處時將會終止線程的執行。面試
處理異常的邏輯是使用try catch finally語句塊,這個語句塊容許經過對可捕獲的異常進行異常處理,相似於一個條件判斷同樣,當出現異常時咱們應該幹什麼,try catch finally語句塊的具體語法規則見其餘資料,這裏說一下一些容易被忽略的地方:spring
1)在try塊中和finally塊中都存在對同一變量的操做,同時在try塊中會返回該變量,具體以下:數組
public static int test(){ int i=10; try{ return i; }finally{ i= i+2; } }
則調用該方法將返回一個什麼值?按照道理說,finally最後將被執行,應該返回12,實際上返回的是10,這是由於在執行到return語句時會建立一個臨時變量用於存放返回值i,執行完finally後再返回臨時變量的值,對於基本數據類型由於是值傳遞,全部finally操做的是方法中的變量而沒有操做臨時變量的數據,所以不會生效,若是是對象,由於臨時變量存放的是對象的變量,因次在finally中的操做將會生效,這裏有些問題就是包裝類和String類和基本類型同樣不會生效,不知道什麼緣由。框架
2)若是是自定義的java類型,則finally中的修改將會生效,具體以下:jvm
public static data test(){ data d = new data(); try{ return d; }finally{ d.inte=15; } } private static class data{ public int inte=10; }
全部的java異常類均拓展於Throwable類,而Throwable類有兩個子類分別是Error和Exception類,Error類表示因爲虛擬機自身緣由致使的錯誤,如虛擬機內部錯誤以及內存溢出等;而Exception則是程序自己的運行狀況致使的錯誤,包含程序邏輯問題以及程序IO交互問題。程序設計基本不怎麼關注Error,換句話說出現Error異常除了重啓以外基本無能爲力,這個是屬於jvm自己的問題,而咱們更多的關注的Exception類錯誤。maven
Exception類包含兩類錯誤:spa
1)RuntimeException(運行時異常),這個是程序設計的邏輯存在問題,說白了就是你的問題,優秀的程序員一般比較少犯這樣的錯誤,新手就很差說了,下面列舉常見的RuntimeException:儘可能不要使用捕獲該異常來解決,應該從設計程序的角度來避免該異常的出現,好比調用一個可能會出現如下異常的方法時,最好是提早作檢查後再調用方法線程
2)IOException(IO異常):這一類異常一般是程序與資源打交道或者以接口打交道形成,程序自己並不能控制資源和接口的正確性,所以這一類異常在程序中是容許發生的,一般咱們須要捕獲這一類異常來肯定在發生異常的狀況下應該作什麼,常見的IOException以下:
題外話:java對異常的處理說白了及時能經過程序控制的就儘可能不讓它出現,不能經過程序控制的就捕獲它來處理,此外咱們應該記住一些基本的異常,說不許哪天面試官就問你說說幾個你常見的異常,若是你說你沒見過異常那就搞笑了