我的對Java異常的簡單理解

Java異常的本質是什麼?

  從本質上來說,java異常是一個java對象(繼承Object),和通常的java對象同樣,封裝了一些成員變量和操做,咱們能夠向操做通常java對象那樣去操做java異常對象(我還特意去試了試可不可使用throw關鍵字操做通常的java對象,發現編譯錯誤,證實它僅僅是操做異常類的語法)java

  從表明的含義上來講:java異常是一種錯誤狀況,是程序不但願出現的現象,可是因爲程序自己的設計邏輯和運行的環境等因素,出現異常的狀況不可避免,java虛擬機針對不一樣的異常狀況定義了不少異常類,當jvm運行程序發現對應的異常時,將會向外面拋出異常程序員

java如何處理異常?

  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異常的分類

   全部的java異常類均拓展於Throwable類,而Throwable類有兩個子類分別是Error和Exception類,Error類表示因爲虛擬機自身緣由致使的錯誤,如虛擬機內部錯誤以及內存溢出等;而Exception則是程序自己的運行狀況致使的錯誤,包含程序邏輯問題以及程序IO交互問題。程序設計基本不怎麼關注Error,換句話說出現Error異常除了重啓以外基本無能爲力,這個是屬於jvm自己的問題,而咱們更多的關注的Exception類錯誤。maven

  Exception類包含兩類錯誤:spa

    1)RuntimeException(運行時異常),這個是程序設計的邏輯存在問題,說白了就是你的問題,優秀的程序員一般比較少犯這樣的錯誤,新手就很差說了,下面列舉常見的RuntimeException:儘可能不要使用捕獲該異常來解決,應該從設計程序的角度來避免該異常的出現,好比調用一個可能會出現如下異常的方法時,最好是提早作檢查後再調用方法線程

      • NullPointerException:空指針異常,這是因爲定義了一個變量在沒有實例化以前就調用引發的異常
      • ClassCastException:類型強制轉換異常
      • IllegalArgumentException:不合法參數異常
      • ArithmeticException:算數運行異常
      • ArrayStoreException:數組中添加非法對象類型異常
      • ArrayIndexOutOfBoundsException:數組下標越界異常(這個異常比較常見)
      • NegativeArraySizeException:建立數組使用負數來肯定數組大小時將會報這個錯誤
      • NumberFormatException:數字格式化異常,這個一般在將字符串的數字轉換爲int類型時報的錯誤,多是字符串根本不能轉換(不是數字或者數字拼接了空格之類)

    2)IOException(IO異常):這一類異常一般是程序與資源打交道或者以接口打交道形成,程序自己並不能控制資源和接口的正確性,所以這一類異常在程序中是容許發生的,一般咱們須要捕獲這一類異常來肯定在發生異常的狀況下應該作什麼,常見的IOException以下:

      • ClassNotFoundExcpetion:找不到類異常,這個不用多說了,使用反射時常常出現
      • NoClassDefException:類依賴異常,spring的ioc框架常見的異常,必定是某個依賴類沒有定義(使用maven管理異常時出現過這種狀況,明明已經導入了相關的jar包,可是仍是出現了這種異常,一般將本地倉庫中對應的依賴異常所對應的包刪掉從新加載便可)
      • FileNotFoundException:找不到文件異常

題外話:java對異常的處理說白了及時能經過程序控制的就儘可能不讓它出現,不能經過程序控制的就捕獲它來處理,此外咱們應該記住一些基本的異常,說不許哪天面試官就問你說說幾個你常見的異常,若是你說你沒見過異常那就搞笑了

相關文章
相關標籤/搜索