1. 程式人生 > 其它 >第9章異常

第9章異常

Throwable類

Throwable是所有異常的父類.而Throwable又有倆個直接子類:

1、Error:這個錯誤一般是JVM和硬體引發的問題,發生了這個錯誤,一般是不通過程式碼去處理問題的

2、Exception:稱之為異常,異常是程式在編譯、執行的時候出現的異常,使用者可以對異常進行具體的處理,一般可以通過修改程式碼來處理異常.如果不去處理異常的話,程式將會停止執行.

只有當物件是Throwable類的子類型別的時候,該物件才能通過java虛擬機器和throw語句丟擲.

例子:

Throwable t1=new Throwable();
//建立一個Throwable型別的異常,括號內可以填寫該異常的詳細資訊

Throwable類有些常用來顯示異常資訊的方法:

1、物件.getMessage();會返回該異常物件的詳細資訊字串

2、物件.toString();當列印物件的時候會自動呼叫的方法,會返回該物件的父類和詳細資訊,

3、物件.printStackTrace();列印方法 這個是最常用的,會打印發生錯誤的程式碼行號,且異常資訊會報紅

異常和錯誤

程式異常是指程式在編譯或執行期間發生了某種異常,需要處理異常,否則程式會結束執行(如陣列索引越界等問題)

程式錯誤時程式在執行期間發生了某種錯誤(Error).通常沒有具體的處理方式,程式會結束執行,一般都是系統級別的問題,使用者一幫無法針對Error進行處理,只能修正程式碼.是JVM所在系統發生並反饋給JVM的.(如記憶體超出等問題)

捕獲處理

用法:

//        //捕獲處理 
//         try {
//             //可能發生異常的程式碼
//         } catch(異常型別 變數名){
//             //發生異常後的處理
//         }
         

如果不進行異常處理的話,一發生異常程式就停止了,如果想要當發生異常後繼續執行catch之後的程式碼,就需要使用到異常捕獲了.

我們可以將可能會發生異常的程式碼放入try語句中,發生異常後處理異常的語句放在catch語句中,而異常處理完想要執行的語句放在後面.

丟擲處理

除了捕獲處理,還有丟擲處理,當方法內部不想處理異常,就可以進行丟擲處理,讓呼叫者來處理異常問題.

例子:

    public static int demomo(int a,int b) throws     Exception{//宣告丟擲異常的型別
        if (b==0)
        {
            throw new Exception("除數為0");
            //throw是用於方法內部用於丟擲一個異常的,而throws是用於方法宣告上的,說明丟擲的異常型別
            //而throw後面只能有一個異常物件,throws後面一次能夠宣告多個異常型別.
        }
        
        
        return a/b;
    }
}

這個方法就進行了丟擲異常,內部不進行處理,而進行丟擲,讓呼叫者自己處理異常.

異常分類

異常分為倆種:

1、執行時異常:是RuntimeException的子類,比如NullPointException(空指標異常)與ArrayIndexOutOfBoundException異常型別

  當方法中丟擲執行時異常時,方法定義中不需要throws宣告丟擲異常的型別,呼叫者不需要處理此異常,需要程式人員修改原始碼.

2、非執行時異常:如果出現了非執行時異常就必須進行處理,也就是必須進行丟擲處理或是捕獲處理,否則編譯器會報錯.

執行時異常例子:

    public static int demomo(int a,int b) {//當方法內丟擲的是執行時異常的時候,方法宣告 
        if (b==0)
        {
            //異常的分類 可以分成執行時異常和非執行時異常 非執行時異常出現時,必須先處理異常,否則不能執行,編譯器會報錯.
            //當方法丟擲執行時異常的時候,方法定義中無須throws宣告,呼叫者無須去處理此異常,執行時異常一旦發生,需要程式人員修改原始碼
            throw new     ArithmeticException("除數為0");//這個異常型別就屬於執行時異常,所以這個方法宣告不用加throws來宣告丟擲異常型別
            //throw是用於方法內部用於丟擲一個異常的,而throws是用於方法宣告上的,說明丟擲的異常型別
            //而throw後面只能有一個異常物件,throws後面一次能夠宣告多個異常型別.
        }
        
        
        return a/b;
    
}

自定義異常

雖然java的jdk中定義了許許多多的異常類,但是有時候還是需要用到自定義異常類

java中所有異常類都是繼承於Throwable,自定義類也一樣,這樣自定義類才能被throw丟擲.

每個異常中都呼叫了父類的構造方法,把異常描述資訊傳遞給了父類,讓父類幫使用者進行異常資訊的封裝.

語法:

Class 異常名 extends Exception //繼承RuntimeException 執行時異常
{
  public 異常名(){//無參構造方法
 }
  public 異常名(String s){//有參構造方法,s為該異常的詳細資訊

  super(s);//將詳細資訊傳遞給父類封裝
 }
}

異常在重寫之中的運用

1、子類覆蓋父類的方法時,如果父類的方法宣告異常,子類只能宣告父類異常或者該異常的子類,或者不宣告異常.

2、當父類方法宣告多個異常時,子類覆蓋時只能宣告多個異常的子集.

3、當被覆蓋的方法沒有異常宣告時,子類覆蓋時無法宣告異常.

4、父類中沒有宣告異常,而實現的子類覆蓋方法發生了異常,無法進行throws宣告,只能catch捕獲處理,如果問題處理不了,catch中繼續使用RuntimeException子型別的異常丟擲.

課後習題1、異常與錯誤的區別是什麼?

  異常是程式在編譯、執行期間發生的某種異常(Exception),若不處理異常,程式會結束執行

  錯誤是程式在執行期間發生的某種錯誤(Error)、程式將會結束執行,Error錯誤發生往往都是系統級別的問題,是jvm所在系統發生並反饋給jvm的.

2、異常有哪幾類別?

  有倆種,分為執行時異常和非執行時異常.非執行時異常發生的時候,必須要進丟擲或捕獲處理,否則編輯器會報錯,

而執行時異常,呼叫者不需要處理此異常,需要程式人員修改原始碼.方法丟擲執行時異常時.方法定義無須throws宣告丟擲異常型別

3、異常常用的有哪幾種處理方式?

  常用的有捕獲處理和丟擲處理