1. 程式人生 > >java之Exception異常

java之Exception異常

異常

定義

程式執行過程中,出現了不正常的情況。最終導致JVM的非正常停止JAVA把這些問題描述成了異常類。出現了不正常就需要把問題報出來。

異常體系

java.lang.Throwable

執行時異常(不可檢測異常)

就是執行時由於程式碼邏輯或者jvm內部記憶體不足而導致程式崩壞。

  • Error 錯誤,虛擬機器異常,系統級別的。
    • Stack Over Flow Error:棧溢位誤差
    • Out of Memory Error:記憶體不足錯誤。
  • RuntimeException以及其子類,執行期異常,本異常是程式設計師的程式碼邏輯錯誤導致的,編譯器不會提示,採用預設處理規則。
    • java.lang.NullPointerException:空指標異常,出現原因:呼叫了未經初始化的物件或者是不存在的物件。
    • java.lang.ClassNotFoundException指定的類找不到;原因:類的名稱和路徑載入錯誤;通常都是程式試圖通過字串來載入某個類時可能引發異常。
    • java.lang.NumberFormatException 字串轉換為數字異常;出現原因:字元型資料中包含非數字型字元。
    • java.lang.IndexOutOfBoundsException 陣列角標越界異常,常見於運算元組物件時發生。
    • java.lang.IllegalArgumentException 方法傳遞引數錯誤。
    • java.lang.ClassCastException 資料型別轉換異常。
    • java.lang.NoClassDefFoundException 未找到類定義錯誤。
    • SQLException SQL 異常,常見於操作資料庫時的 SQL 語句錯誤
    • java.lang.InstantiationException 例項化異常。
    • java.lang.NoSuchMethodException 方法不存在異常。

非執行時異常

可檢測異常,編譯時異常,非RuntimeException,編譯期異常,在寫程式碼的時候編譯器如果不給處理方式,就編譯不通。需要我們手動try或者丟擲的異常。

異常物件的常用方法

  • public void printStackTrace();列印異常資訊,包含了異常的型別,異常的原因,還包括異常出現的位置,在開發和除錯階段,都得使用printStackTrace。
  • public String getMessage();獲取發生異常的原因,提示給使用者的時候就提示錯誤原因。
  • public String toString();獲取異常的型別和異常描述資訊(不用)。

異常處理

  • throw 用在方法內部,用來丟擲異常物件。
  • try-catch-finally
    • try:用來檢測異常。
    • catch:捕獲異常。
    • finally:關閉資源,一定會執行,除了遇到System.exit();

注意:
1. 可以有多個catch,去捕捉
2. 在try後,出現了一個異常,後面的程式碼將不會繼續執行。

throw和throws區分

throw

作用:建立異常物件,當程式執行到此處時就會發生我們建立的異常,如果沒有處理try/catch,是直接跑給虛擬機器的那麼程式就會停止執行。

用法:在方法內使用。

格式:

throw new 異常類名()

throws

作用:當我們編寫程式碼時發生變異時異常,我們不想try/catch處理掉,那我們就可以使用throws把異常丟擲去,交給人處理,這裡誰使用本方法誰就去處理,如果是在主函式main方法中就把異常給丟擲去,那麼就是Jvm虛擬機器處理,他們的處理方式就是一旦發生異常就會讓程式停止執行。

格式:

public static void main(String[] args) throws InterruptedException{}

自定義異常類

格式:
1. 建立一個類,繼承Exception。
2. 根據父類的構造,生成一個可以新增異常資訊的構造方法。
3. 通過throw丟擲一個異常物件。

注意:

  • 自定義執行時異常,繼承RunTimeException。
  • 自定義編譯時異常,繼承Exception。

++問題:自定義異常實現使用者註冊使用者名稱重複的異常提醒。++

測試類Demo01.java

public class Demo01 {

    //建立一個數組,模擬資料庫

    static String[] arr = {"Tracy", "James", "Jon"};

    public static void main(String[] args) throws LoginExcption {
        //鍵盤錄入,模擬註冊時,輸入使用者名稱
        Scanner sc = new Scanner(System.in);
        String username = sc.nextLine();

        //校驗使用者名稱是否存在
        checkName(username);//如果出現異常後面的程式碼將不會繼續執行。
        System.out.println("註冊成功");
    }

    //此方法用於校驗使用者名稱是否存在
    public static void checkName(String username) throws LoginExcption {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].equals(username)) {
                throw new LoginExcption("使用者名稱已存在");

            }
        }
    }
}

自定義異常類LoginExcption.java

public class LoginExcption extends Exception {

    public LoginExcption() {
    }

    public LoginExcption(String message) {
        super(message);
    }
}