1. 程式人生 > 其它 >Java基礎第二遍-09-面向物件-異常

Java基礎第二遍-09-面向物件-異常

簡介

  1. Java中用類的形式對不正常情況進行了描述和封裝物件
  2. 描述不正常情況的類就稱為異常類
  3. 在有專門的異常類之前,正常流程程式碼和問題處理程式碼相結合
  4. 在有異常類之後,將正常流程程式碼與問題處理程式碼進行分離,提高閱讀性
  5. 異常:就是Java通過面向物件的思想將問題封裝成了一個物件,用異常類(Throwable異常類的祖宗類)對其進行描述,不同的問題使用不同的類進行描述
  6. Throwable下有兩個子類,無論是Error還是Exception 都是程式執行過程中的問題,都需要通知呼叫者,所以需要丟擲
    1. Error:描述不可解決問題,一般是由JVM丟擲的嚴重性問題,解決方案,修改程式
    2. Exception:可處理問題
  7. Throwable的及其所有的子類都具有可拋性,凡是具有可拋性的類或物件都可以被throw、throws操作,同理被他們操作的都具有可拋性。

異常的分類-及異常的宣告

  1. 編譯時被檢測異常:只要是Exception和其子類都是,除了特殊類RuntimeException類
    1. 編譯時檢測是為了希望,這種問題儘早的進行處理
  2. 編譯時不檢測異常(執行時異常):就是Exception中的RuntimeException和其子類。
class MyException extends Exception{//直接繼承的是Eception在使用此類的時候需要宣告

}

class Test13{
    int mothod(int [] arr, int index) {
        return arr[index];
    }
    void test() throws MyException {//宣告異常類
        throw new MyException();//此異常類為編譯檢測異常類,需要進行宣告
    }
}
2. 這種問題的發生更多是呼叫者使用不當造成的,一般不進行處理,直接編譯通過,在執行的時候強制程式,讓呼叫者修改程式
class MyException_2 extends RuntimeException{//直接繼承的是RuntimeEception在使用此類的時候不進行宣告

}

class Test13_2{
    int mothod(int [] arr, int index) {
        return arr[index];
    }
    void test(){
        throw new MyException_2();//此異常類為執行時檢測異常類,不進行宣告
    }
}
  1. 為什麼進行異常的宣告?
    1. 是為了對異常進行處理try{}catch(){}finally{}
  2. 總結:
    1. 所以自定義異常要麼繼承Exception、或者RuntimeException

異常處理的捕獲

  1. 格式:try{}catch(){}finally{}
  2. 執行流程:
package com.bixiangdong.oop;
class MyException14 extends RuntimeException{
    MyException14(String message){
        super(message);
    }
}
class Test14{
    int method(int[] arr,int index){
        if (index<0)
            throw new MyException14("下標不能為負數");
        return arr[index];
    }
}
public class Demo14 {
    public static void main(String[] args) {
        try{
            new Test14().method(new int[]{1,232,5,3,53},-1);
        }catch (MyException14 e){
            System.out.println(e);
            System.out.println(e.toString());//異常處理類中 e是一個物件,應該打印出一個記憶體地址,
            // 但是java對其進行了一系列處理,所以打印出來的是一個訊息字串
            e.printStackTrace();//JVM的異常列印機制呼叫的也是這個方法
        }

    }
}
  1. 如果丟擲多個異常,需要使用多個catch進行處理,catch(XXException e)其中的xxException需要按照從子類到父類依次往下寫
try {
            new Test14().method(new int[]{1,232,5,3,53},-1);
        }catch (MyException14 e){//兒子類
        }catch (RuntimeException e){//爸爸類
        }catch (java.lang.Exception e){//爺爺類
        }

異常的丟擲流程

  1. 異常丟擲throw
  2. 異常丟擲throws

自定義異常

  1. 命名特點:xxxxException、xxxxError

異常處理的規則

  1. 函式內容如果丟擲需要檢測的異常,那麼函式上必須要宣告(throws),否則在函式內部使用try{}catch(){}捕捉,否則編譯失敗
  2. 如果呼叫了宣告異常的函式,要麼try{}catch(){},要麼throws,否則編譯失敗
  3. 什麼時候使用catch、什麼時候使用throws?
    1. 如果可以處理就用catch
    2. 不能處理,就用throws丟擲異常,給呼叫者處理(try{}catch(){})
  4. 一個功能如果丟擲多個異常,那麼就需要catch幾個異常,且按子類 父類依次捕獲