異常Java

最愛吃雞肉卷發表於2022-02-23

異常

1.什麼是異常

  • 異常指程式執行過程中出現的不期而至的各種狀況,如:檔案找不到、網路連線失敗等
  • 異常發生在程式執行期間,它影響了正常的程式執行流程
public class Demo01 {
    public static void main(String[] args) {
        System.out.println(11/0);

    }


}

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.exception.Demo01.main(Demo01.java:5)

2.異常體系結構

  • Java把異常當作物件來處理,並定義一個基類Java.lang.Throwable作為所有異常的超類
  • 在Java API中已經定義了許多異常類,這些異常類分為兩大類,錯誤Error和異常Exception

Error:

  • Error類物件由Java虛擬機器生成並丟擲,大多數錯誤與程式碼編寫者所執行的操作無關
  • Java虛擬機器執行錯誤(Virtual MachineError),當JVM不再有繼續執行所需要的記憶體資源時,將出現OutOfMemoryError。這些異常發生時,Java虛擬機器一般會選擇線路終止
  • 還有發生在虛擬機器試圖執行應用時,如類定義錯誤(NOClassDefFoundError)、連結錯誤(LinkageError)。這些錯誤是不可查的,因為它們在應用程式的控制和處理能力之外,而且絕大多數是程式執行時不允許出現的狀況。

Exception

  • RuntimeException(執行時異常)

    • ArrayIndexOutOfBoundException(陣列下標越界)

    • NullPointException(空指標異常)

    • ClassNotFoundException(找不到類)

    • 這些異常是不檢查異常,程式可以選擇捕獲處理,也可以不處理

    • 這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這些異常的發生;

  • 非執行時異常

error 和Exception的區別:

error通常是災難性的致命錯誤,是無法控制和處理的,當出現這些異常時,Java虛擬機器一般會選擇終止執行緒;Exception通常情況下是可以被程式處理的,並且程式中應該儘可能的去處理這些異常。

3.Java異常處理機制

  • 丟擲異常

  • 捕獲異常

  • 異常處理的五個關鍵字

    • try、catch、finally、throw、throws

4.處理異常

public class Test {
    public static void main(String[] args) {
        int a=1;
        int b=0;

//        假設要捕獲多個異常:從小到大
        try {//監控區域
           System.out.println(a/b);

        }catch (Error e){//catch(想要捕獲的異常型別)捕獲異常
//            System.out.println("程式出現異常,變數b不能為0");//手動
            System.out.println("Error");
        }catch (Exception e){
            System.out.println("exception");//exception

        }catch (Throwable e) {
            System.out.println("Throwable");
        }finally
         {//處理善後工作
            System.out.println("finally");
        }
//        finally可以不要,
    }  
  }
 }
public class Test {
    public static void main(String[] args) {
        int a=1;
        int b=0;
        try {
            System.out.println(a/b);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
//    建設這個方法中處理不了這個異常,方法上丟擲異常
    public void test(int a,int b) throws ArithmeticException{
        if (b==0){
            thorw new ArithmeticException();//主動丟擲異常,一般在方法中使用
        }
    }

}

5.自定義異常

  • 使用Java內建異常類可以描述在程式設計時出現的大部分異常情況。除此之外,使用者還可以自定義異常,自定義異常只需要繼承Excepetion類即可

步驟:

  • 1.建立自定義異常類
  • 2.在方法中通過throw關鍵字丟擲異常物件。
  • 3.如果在當前丟擲異常的方法中處理異常,可以使用try-catch語句捕捉並處理;否則在方法的宣告處通過throws關鍵字指明要丟擲給方法呼叫者的異常,繼續進行下一步操作
  • 4.在出現異常方法的呼叫者中捕獲並處理異常。
//繼承Exception類
public class MyExcwption extends Exception {
//    傳遞數字>10;
    private int detail;

    public MyExcwption(int a) {
        this.detail = a;
    }

//    toString :異常列印資訊

    @Override
    public String toString() {
        return "MyExcwption{"+detail+'}';
    }
}
public class Test {
//    可能會存在異常的方法
    static void test(int a)throws MyExcwption{
        System.out.println("傳遞引數為"+a);
        if (a>10){
            throw new MyExcwption(a);//丟擲
        }
        System.out.println("OK");
    }

    public static void main(String[] args) {
        try {
            test(11);
        } catch (MyExcwption e) {
            System.out.println(e);
        }
    }
}

實際應用中的經驗總結:

  • 處理執行時異常時,採用邏輯去合理規避同時輔助try catch處理

  • 在多重catch塊後面,可以加一個catch (Exception) 來處理可能會被遺漏的異常對於不確定的程式碼,也可以加上try-catch,處理潛在的異常

  • 儘量去處理異常,切忌只是簡單地呼叫printStackTrace() 去列印輸出

  • 具體如何處理異常,要根據不同的業務需求和異常型別去決定

  • 儘量新增finally語句塊去釋放佔用的資源,I0F Scanner~