1. 程式人生 > 實用技巧 >Java基礎學習之異常處理(6)

Java基礎學習之異常處理(6)

@目錄

1.異常是什麼

異常就是程式執行中可能會出現的錯誤,例如檔案找不到,網路超時等。
異常Exception的父類時Throwable,Throwable實現了Serializable可序列化,有兩個子類:Error和Exception。

1.1.Error

Error錯誤不是異常,是JVM本身的錯誤,無法通過程式碼處理。
後續的JVM相關文章中會說到,以及一些常見的Error和他們出現的情況,這裡不贅述了。

1.2.Exception

Exception即異常,程式執行時發生,可通過Java的異常處理機制處理。
Exception又分為檢查性異常和執行時異常。
檢查性異常:強制需要程式設計師進行處理的異常,例如IOException類。
執行時異常又稱非檢查性異常,例如RuntimeException類。

2.異常處理機制

Java中異常的處理過程一般是捕獲異常再處理。

2.1.捕獲異常

語法:

try {
	//可能會發生異常的程式碼
} catch (Exception e) {
	//異常處理
} finally {
    //finally子塊
}

catch中的Exception為異常型別,多個catch子塊可以捕捉多個異常型別。finally子塊無論如何都會執行。
例如:

public class TestException {
	public static void main(String[] args) {
		try {
            int i = 1/0;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        	System.out.println("finally");
        }
	}
}

執行結果:

2.2.丟擲異常

使用關鍵字throws將異常丟擲給執行時系統,由執行時系統處理異常。
例如:

public class TestException {
    public static void main(String[] args) {
        try {
            test();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void test() throws Exception{
        int i = 1/0;
    }
}

執行結果:

3.自定義異常

之前有區分異常:

  • 檢查性異常:繼承Exception類
  • 執行時異常:繼承RuntimeException類

3.1.自定義檢查性異常

例如:網站註冊,使用者如果年齡低於18報出異常

public class MyException extends Exception {
    public MyException() {
        super();
    }

    public MyException(String msg) {
        super(msg);
    }

    public static void main(String[] args) {
        int age;
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入你的年齡:");
        try {
            age = scanner.nextInt();
            if (age < 18) {
                throw new MyException("你未成年不能註冊");
            }
        } catch (MyException e) {
            System.out.println(e.getMessage());
        }
    }
}

執行結果:

3.2.自定義執行時異常

例子和上面一樣,修改一些內容:

public class MyException extends RuntimeException {
    public MyException() {
        super();
    }

    public MyException(String msg) {
        super(msg);
    }

    public static void main(String[] args) {
        int age;
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入你的年齡:");
        age = scanner.nextInt();
        if (age < 18) {
            throw new MyException("你未成年不能註冊");
        }
    }
}

執行結果: