1. 程式人生 > 其它 >異常的注意事項

異常的注意事項

異常的注意事項

多個異常使用捕捉又該如何處理:
1.多個異常分別處理
2.多個異常一次捕獲,多次處理
3.多個異常一次捕獲一次處理

多個異常分別處理

public class moreException {
    public static void main(String[] args) {

        try {
            int[] arr={1,2,3};
            System.out.println(arr[3]);
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println(e);
        }

        try {
            List<Integer> list = List.of(1, 2, 3);
            System.out.println(list.get(3));
        }catch (IndexOutOfBoundsException e){
            System.out.println(e);
        }
        System.out.println("後續程式碼");
   }
}
/*java.lang.ArrayIndexOutOfBoundsException: 3
java.lang.IndexOutOfBoundsException: Index 3 out-of-bounds for length 3
後續程式碼*/

多個異常一次捕獲,多次處理

注意:只會彈出丟擲的第一個異常

public class moreException {
    public static void main(String[] args) {
     
     try {
            int[] arr={1,2,3};
            System.out.println(arr[3]);
            List<Integer> list = List.of(1, 2, 3);
            System.out.println(list.get(3));
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println(e);
        }catch (IndexOutOfBoundsException e){
        System.out.println(e);
    }
        System.out.println("後續程式碼");
   }
}//java.lang.ArrayIndexOutOfBoundsException: 3
//後續程式碼

注意事項:catch裡邊定義的異常變數,如果有子父類關係,那麼子類的異常變數必須寫在上面,否則會報錯。 ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException

多個異常一次捕獲一次處理

要點:只寫一個catch語句,裡面是其他異常變數的超類

public class moreException {
    public static void main(String[] args) {
      try {
        int[] arr={1,2,3};
        System.out.println(arr[3]);
        List<Integer> list = List.of(1, 2, 3);
        System.out.println(list.get(3));
    }catch (IndexOutOfBoundsException e){
    System.out.println(e);
}
    System.out.println("後續程式碼");
    }
}
  • 執行時異常被丟擲考科一不處理,既不捕獲也不宣告丟擲。

  • 如果finally中有return語句,永遠返回finally中的結果,要避免該情況。

  • 如果父類丟擲了多個異常,子類重寫父類方法時,丟擲和父類相同的異常或者是父類異常的子類,或者不丟擲異常。

  • 父類沒有丟擲異常,子類重寫父類該方法是也不可丟擲異常。此時子類產生該異常,只能捕獲處理,不能宣告丟擲。

  • 在try/catch後可以追加finally程式碼塊,其中的程式碼一定會被執行,通常用於資源回收。

public class Fu {
public void show01() throws NullpointerException,classcastException{}
public void show02() throws IndexoutOfBoundsException{}
public void show03() throws IndexOutOfBoundsException{}
public void show04(){}

class zi extends Fu{
//子類重寫父類方法時,丟擲和父類相同的異常
public_void show01() throws NullPointerException,classcastException{}
//子類重寫父類方法時,丟擲父類異常的子類
public void show02() throws ArrayIndexoutOfBoundsException{}
//子類重寫父類方法時,不丟擲異常
public void showe3(){}
    /*父類沒有丟擲異常,子類重寫父類該方法是也不可丟擲異常。*/
	public void show04() 
    /*此時子類產生該異常,只能捕獲處理,不能宣告丟擲*/
        public void show(){
        try{
            throw new Exception("編譯期異常");
        }catch(Exception e){
            e.printStackTrace(); 
        }
    }
}

自定義異常

格式:
public class XXXException extends Exception / RuntimeException{
新增一個空參的構造方法
新增一個帶異常資訊的構造方法
}
注意:
1.自定義異常類一般都是一Exception結尾,說明該類是一個異常類
2.自定義異常類,必須繼承Exception或者RuntimeException
繼承Exception:那麼自定義的異常類就是一個編譯期異常,如果方法內部丟擲了編譯期異常,就必須
處理這個異常,要麼throws,要麼try...catch
繼承RuntimeException:那麼自定義的異常類就是一個執行期異常,無需處理,交給JVM處理(中斷處理)

public class MakeException extends Exception{
	//新增一個空參的構造方法
    public MakeException(){
        super();
    }
    /*新增一個帶異常資訊的構造方法
    檢視原始碼發現,所有的異常類都會有一個帶異常資訊的構造方法,方法內部會呼叫父類帶異常資訊
    的構造方法,讓父類來處理這個異常資訊。*/
    public MakeException(String message){
        super(message);
    }
}