Java異常詳細介紹

喻魚魚發表於2020-12-06

原始碼:

package cn.ecut.Exception;

/**
 * Java三種型別的異常
 * 1、檢查性異常(IOException):最具代表的檢查性異常是使用者錯誤或問題引起的異常,這是程式設計師無法預見的
 *    例如要開啟一個不存在的檔案時,一個異常就發生了,這些異常在編譯時不能簡單地忽略
 * 2、執行時異常(RuntimeException):執行時異常是可能被程式設計師避免的異常,與檢查性異常相反,執行時異常可以在編譯時被忽略
 * 3、錯誤(Error):錯誤不是異常,而是脫離程式設計師控制的問題。錯誤在程式碼中通常被忽略。例如,當棧溢位時,一個錯誤就發生了
 *    它們在編譯時被忽略
 *
 * 關鍵字:try catch finally throw throws
 *
 * Error和Exception的區別:Error通常是災難性的致命的錯誤,是程式無法控制和處理的,當出現這些異常時,Java虛擬機器(JVM)
 * 一般會選擇終止執行緒;Exception通常情況下是可以被程式處理的,並且在程式中應該儘可能的去處理這些異常
 */
public class Demo1 {
    public static void main(String[] args) {
        int a=1;
        int b=0;
        try{                                    //try監控區域
            System.out.println(a/b);
        }catch(ArithmeticException e){          //catch 捕獲異常
            System.out.println("分母不能為0!");
        }finally{                               //finally 處理善後工作
            System.out.println("finally");
        }


    }

}

執行結果:

分母不能為0finally

原始碼:

package cn.ecut.Exception;

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

        //假設要捕獲多個異常:從小到大!

        try {                                    //try監控區域
            System.out.println(a / b);
        } catch (Error e) {                     //catch 捕獲異常
            System.out.println("Error!");
        } catch (Exception e) {
            System.out.println("Exception!");
        } catch (Throwable t) {
            System.out.println("Throwable!");
        } finally {                               //finally 處理善後工作
            System.out.println("finally");
        }
    }

}

執行結果:

Exception!
finally

原始碼:

package cn.ecut.Exception;

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


        try{                                    //try監控區域
            System.out.println(a/b);
        }catch(Exception e){                    //catch 捕獲異常
            e.printStackTrace();                //列印錯誤資訊
        }finally{                               //finally 處理善後工作
            System.out.println("finally");
        }


    }
}

執行結果:

java.lang.ArithmeticException: / by zero
	at cn.ecut.Exception.Demo3.main(Demo3.java:10)
finally

原始碼:

package cn.ecut.Exception;

public class Demo4 {
    public static void main(String[] args) {
        try{
            new Demo4().test(1,0);
        }catch(ArithmeticException e){
            System.out.println("分母不能為0!");
            e.printStackTrace();
        }

    }


    //假設在這方法中,處理不了這個異常(沒有try...catch),方法上丟擲異常(throws),誰呼叫這個方法誰就要處理這個異常
    //呼叫者可以選擇捕獲異常(try...catch)或者繼續向上丟擲異常(throw)
    public void test(int a,int b)throws ArithmeticException{
        if(b==0){
            throw new ArithmeticException(); //主動丟擲異常,一般在方法中使用
        }else{
            System.out.println(a/b);
        }

    }
}

執行結果:

分母不能為0!
java.lang.ArithmeticException
	at cn.ecut.Exception.Demo4.test(Demo4.java:19)
	at cn.ecut.Exception.Demo4.main(Demo4.java:6)

原始碼:

package cn.ecut.Exception;

/**
 * 自定義的異常類
 */
public class MyException extends Exception {
    //傳遞數字>13
    private int detail;
    public MyException(int a){
        this.detail=a;
    }
    public String toString(){
        return "MyException{"+detail+'}';
    }

}
package cn.ecut.Exception;

public class Test {
    public static void main(String[] args) {
        try{
            test(14);
        }catch(MyException e){
            System.out.println("Myexception=>"+e);
        }
    }
    static void test(int a) throws MyException{
        System.out.println("傳遞的數為:"+a);
        if(a>13){
            throw new MyException(a);
        }
    }
}

執行結果:

傳遞的數為:14
Myexception=>MyException{14}

相關文章