Java零基礎之異常(新手必看)

耳東chen發表於2020-11-14

異常

本質上異常是程式上的錯誤,包括程式邏輯錯誤和系統錯誤

異常體系

所有異常的父類--------Throwable

  1. Error(不可處理)
    1. 執行期異常(RuntimeException)
    2. 非執行期異常
  2. Exception(可處理)

常見異常

  • IndexOutOfBoundsException

    下標越界,例如陣列長度為5,卻操作第十位的資料

  • NullPointerExceptiopn

    空指標異常,未賦值便操作

  • ArithmeticException

    異常運算條件 例如:7除0

  • IllegalArgumentException

    非法引數

  • ClassCastException

    強制型別轉換例項錯誤,例如:

    Man extends People

    Woman extends People

    People person = new Man( );

    Woman xx = (Woman) person;

異常處理流程

try --catch–finally(總會執行,多用於釋放資源)

  1. 首先執行try中的程式碼塊

  2. 若有異常則進行catch捕獲異常,並根據異常的種類,執行不同的catch中的程式碼

  3. 無論如何最終都會執行finally中的程式碼

    try嘗試
    {
      需要被檢測異常的程式碼
    }
    catch(異常類 變數)
    {
      處理異常的程式碼
    }
    catch(異常類 變數)
    {
      處理異常的程式碼
    }
    finally最終化
    {
      一定會被執行的程式碼
    }
    

異常處理原則

  1. 方法內如果丟擲需要檢測的異常,那麼方法上必須要宣告,否則必須在方法內用try-catch捕捉,否則編譯失敗。

  2. 如果呼叫了宣告異常的函式,要麼try-catch要麼throws,否則編譯失敗。

  3. .什麼時候catch,什麼時候throws?功能內容可以解決,用catch,解決不了,用throws告訴呼叫者,有呼叫者解決。

  4. 如果一個功能丟擲了多個異常,那麼呼叫時必須有對應多個catch進行鍼對性的處理。

異常的丟擲 **throws Exception **

當我們將該類的異常直接丟擲後,可以不用在此類中執行該類的try catch的異常捕獲操作,進而將異常拋到執行該類的類中去進行try catch操作

public class ThrowsException {
//顯示異常  必須處理,如果不在該類中處理,那就必須在呼叫它的類中使用


    public static Date dateTransfer(String date) throws ParseException {//丟擲此異常,所以此類中可有不用處理該異常
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return simpleDateFormat.parse(date);
    }
    public static void main(String[] args) {
        try {
            System.out.println(dateTransfer("1999-02-78"));
        } catch (ParseException e) {//呼叫了該方法,所以必須處理該異常,並且已經無法再向外丟擲
            e.printStackTrace();
        }

    }
}

throw &throws

throw為人為觸發一個異常,出現在方法內部後面跟異常物件

throws為可能出現的異常,出現在方法宣告上

自定義異常

可以通過extends Exception來自定義一個異常

例如下面程式碼展示的 AppException & SystemException

AppException code

public class AppException extends Exception {
    private int ErroCode;
    private String ErrorMessage;

    public int getErroCode() {
        return ErroCode;
    }

    public void setErroCode(int erroCode) {
        ErroCode = erroCode;
    }

    public String getErrorMessage() {
        return ErrorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        ErrorMessage = errorMessage;
    }

    public AppException(int erroCode, String errorMessage) {
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }

}

//TestCode============================================

public class TestException {

    public static int Divide(int a,int b) throws AppException {
                  try{
                      return a/b;
                  }catch(Exception e){
                          throw new AppException(999,"AppException");//throw人為丟擲一個異常,將原有的異常轉化為A異常
                  }

    }

    public static void main(String[] args) {
        try {
            System.out.println(Divide(2,0));
        } catch (AppException e) {
            System.out.println(e.getErroCode());
            System.out.println(e.getErrorMessage());
        }
    }
}


SystemException code

public class SystemException extends Exception {
    private int ErroCode;
    private String ErrorMessage;

    public int getErroCode() {
        return ErroCode;
    }

    public void setErroCode(int erroCode) {
        ErroCode = erroCode;
    }

    public String getErrorMessage() {
        return ErrorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        ErrorMessage = errorMessage;
    }

    public SystemException(int erroCode, String errorMessage) {
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }

    public SystemException(String message, int erroCode, String errorMessage) {
        super(message);
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }

    public SystemException(String message, Throwable cause, int erroCode, String errorMessage) {
        super(message, cause);
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }

    public SystemException(Throwable cause, int erroCode, String errorMessage) {
        super(cause);
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }

    public SystemException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, int erroCode, String errorMessage) {
        super(message, cause, enableSuppression, writableStackTrace);
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }
}
//TestCode=============================================

public class TestSys {

    public static int Divide2(int a) throws SystemException {
        try{
            int []aaa = new int[2];
            aaa[3]=a;
            return aaa[3];
        }catch(Exception e){
            throw new SystemException(1000,"system error");
        }

    }

    public static void main(String[] args) {
        try {
            System.out.println(Divide2(34));
        } catch (SystemException e) {
            System.out.println(e.getErroCode());
            System.out.println(e.getErrorMessage());
        }
    }

}

常見異常方法:

Error

img

非執行期異常

img

執行期異常

img

相關文章