Java核心API -- 9(異常)

 

異常處理java

    異常結構中的父類Throwable類,其下子類Exceptionlei類和Error類。咱們在程序中能夠捕獲的是Exception的子類異常。編程

    Error系統級別的錯誤:Java運行時環境出現的錯誤,咱們不可控。ide

    Exception是程序級別的錯誤:咱們可控。spa

    1)捕獲異常兩種方式: orm

    一是添加try-catch捕獲該異常,二是在咱們的方法中聲明出也追加這種異常的拋出(繼續往外拋)。blog

    2)異常處理語句:try-catch,若是try塊捕獲到異常,則到catch塊中處理,不然跳過忽略catch塊(開發中,必定有解決的辦法才寫,沒法解決就向上拋throws);良好的編程習慣,在異常捕獲機制的最後書寫catch(Exception e)(父類,頂極異常)捕獲未知的錯誤(或不須要針對處理的錯誤);catch的捕獲是由上至下的,因此不要把父類異常寫在子類異常的上面,不然子類異常永遠沒有機會處理!在catch塊中可使用方法獲取異常信息:① getMessage()方法:用來獲得有關異常事件的信息。② printStackTrace()方法:用來跟蹤異常事件發生時執行堆棧的內容。繼承

        try{ // 關鍵字,只能有一個try語句事件

                可能發生異常的代碼片斷ip

        }catch(IOException e){ // 列舉代碼中可能出現的異常類型資源

            當出現了列舉的異常類型後,在這裏處理,並有針對性的處理

       }catch(Exception e){ // 列舉代碼中可能出現的異常類型

            當出現了列舉的異常類型後,在這裏處理,並有針對性的處理

        }

    3)throws關鍵字:不但願直接在某個方法中處理異常,而是但願調用者統一處理該異常。聲明方法的時候,咱們能夠同時聲明可能拋出的異常種類,通知調用者強制捕獲。就是所謂的「醜話說前面」。原則上throws聲明的異常,必定要在該方法中拋出。不然沒有意義。相反的,若方法中咱們主動經過throw拋出一個異常,應該在throws中聲明該種類異常,通知外界捕獲。注意:不能在main方法上throws,由於調用者JVM直接關閉程序。

    4)java中拋出異常過程:java虛擬機在運行程序時,一但在某行代碼運行時出現了錯誤,JVM會建立這個錯誤的實例,並拋出。這時JVM會檢查出錯代碼所在的方法是否有try捕獲,如有,則檢查catch塊是否有能夠處理該異常的能力(看可否把異常實例做爲參數傳進去,看有沒有匹配的異常類型)。若沒有,則將該異常拋給該方法的調用者(向上拋)。以此類推,直到拋至main方法外仍沒有解決(即拋給了JVM處理)。那麼JVM會終止該程序。

    5)java中的異常Exception分爲:

        ①非檢測異常(RuntimeException子類):編譯時不檢查異常。若方法中拋出該類異常或其子類,那麼聲明方法時能夠不在throws中列舉該類拋出的異常。常見的運行時異常有: NullPointerException、 IllegalArgumentException、 ClassCastException、NumberFormatException、 

ArrayIndexOutOfBoundsException、ArithmeticException

        ②可檢測異常(非RuntimeException子類):編譯時檢查,除了運行時異常以外的異常,都是可檢查異常,則必須在聲明方法時用throws聲明出可能拋出的異常種類!

    6)finally塊:finally塊定義在catch塊的最後(全部catch最後),且只能出現一次(0-1次), 不管程序是否出錯都會執行的塊! 無條件執行!一般在finally語句中進行資源的消除工做,如關閉打開的文件,刪除臨時文件等。

    public static void main(String[] args) {

        System.out.println( test(null)+","+test("0")+","+test("") );

    }

    /**輸出結果?1,0,2 ? 4,4,4爲正確結果 */

    public static int test(String str){

        try{ 

            return str.charAt(0)-'0';

        }catch(NullPointerException e){

            return 1;

        }catch(RuntimeException e){

            return 2;

        }catch(Exception e)

            return 3;   

        }finally{

            return 4; //無條件執行

        }             

    } 

    7)重寫方法時的異常處理

    若是使用繼承時,在父類別的某個地方上宣告了throws某些異常,而在子類別中從新定義該方法時,能夠:①不處理異常(從新定義時不設定throws)。②可僅throws父類別中被從新定義的方法上的某些異常(拋出一個或幾個)。③可throws被從新定義的方法上的異常之子類別(拋出異常的子類)。

    但不能夠:①throws出額外的異常。 ②throws被從新定義的方法上的異常之父類別(拋出了異常的父類)

    8)常見異常

         wKioL1WXTNTDRwjvAALzLdPRI3Q638.jpg

相關文章
相關標籤/搜索