異常是什麼和怎麼去處理!--

wah369發表於2020-10-27

為什麼要學習異常?

如果不處理異常,就會交給JVM處理異常,一旦交給JVM,程式就會異常終止。

java中異常體系:錯誤和異常

錯誤是程式碼中客觀存在的,有兩種方式處理:

LBYL : Look Before You Leap. 在操作之前就做充分的檢查 .
EAFP : It's Easier to Ask Forgiveness than Permission. " 事後獲取原諒比事前獲取許可更容易 ". 也就是先操作 , 遇到
問題再處理 .
 

異常分為執行時異常(非受查異常)和編譯時異常(受查異常)

每個人開始寫程式碼都會遇到或多或少的異常,例如:

public static void main(String[] args) {
        System.out.println(10/0);   //算術異常
    }
public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println(arr[100]);    //陣列越界異常
    }
public int num = 10;
    public static void main(String[] args) { 
        TestDemo t = null;
        System.out.println(t.num);  //空值異常
        
    }

所以:異常就是在程式執行時出現錯誤時通知呼叫者的一種機制。

處理方式:

一、捕獲異常         try... catch.......

public static void main(String[] args) {
        try {
            System.out.println(10/0);
        }catch (ArithmeticException e) {
            System.out.println("算術異常");
        }
        System.out.println("我還能行");

    }

所以只要捕獲相應的異常,程式就能繼續執行

也可以捕獲多個異常:
public static void main(String[] args) {
        try {
            System.out.println(10/5);
            int[] array = null;
            System.out.println(array.length);
        }catch (ArithmeticException | NullPointerException e) {  
                  //可以用(Exception  e)直接捕獲全部異常,不推薦
            e.printStackTrace();
            System.out.println("異常");
        }
        System.out.println("我還能行");

    }

但是,catch只能處理對應種類的異常。

finally:finally塊當中的程式碼一定會被執行

 public static void main(String[] args) {
        try {
            System.out.println(10 / 0);
            int[] array = null;
            System.out.println(array.length);
        }catch (Exception e) {
            e.printStackTrace();
            System.out.println("異常");
        }finally {
            System.out.println("finally塊當中的程式碼一定會被執行!");
        }
        System.out.println("我還能行");
    }
public static void main(String[] args) {
        System.out.println(func2());
    }
    public static int func2() {
        try {
            return 10;
        } finally {
            return 20;
        }
    }
//最後會列印出20

close:

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        try  {
            int a = scanner.nextInt();
            System.out.println(10 / a);
            int[] array = null;
            System.out.println(array.length);
        } catch (ArithmeticException | NullPointerException e) {
            e.printStackTrace();
            System.out.println("異常");
        } finally {
            System.out.println("finally塊當中的程式碼一定會被執行!");
            scanner.close();   //退出
        }
        System.out.println("我還能行");
    }

當方法中的異常比較多,可以用throw宣告異常:

public static void main(String[] args) {
        try {
            func();
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        }
       System.out.println("after try catch");
    }
    public static void func() throws ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException {
        int[] arr = {1, 2, 3};
        System.out.println(arr[100]);   //陣列越界異常
    }

下來是如何去寫有異常的程式碼:有註釋

    public static double func(int x,int y)throws ArithmeticException{
        if (y == 0) {
            throw new ArithmeticException("除數為0");  //如果y = 0,丟擲算術異常
        }
        return x*1.0 / y ;
    }

//上面這個方法宣告瞭會出現算術異常,但沒有處理,下來我們寫程式碼時就可以處理一下
    public static void main5(String[] args) {
        try{
            System.out.println(func(10,0));

        }catch (ArithmeticException e){
            e.printStackTrace();
            System.out.println("除數為零");
        }
    }

自定義異常:有註釋

class MyException extends Exception{        //繼承於編譯時異常更安全
    public MyException() {
    }
    public MyException(String message) {
        super(message);
    }
}
public class TestDemo {

    public static void func3(int x)throws MyException{
        if (x == 10) {
            throw new MyException("x==10");       //如果x=10,丟擲異常
        }
    }

    public static void main(String[] args) {
        try {
            func3(10);             //呼叫方法時可以自己處理異常
        }catch (MyException e) {
            e.printStackTrace();
        }
    }
}

 

 

 

相關文章