Java核心API -- 9(異常)

 

異常處理

    異常結構中的父類Throwable類,其下子類Exceptionlei類和Error類。我們在程序中可以捕獲的是Exception的子類異常。

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

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

    1)捕獲異常兩種方式:

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

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

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

                可能發生異常的代碼片段

        }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

 

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