Java異常處理機制

1. 異常層次結構圖

在這裏插入圖片描述

圖片來自網絡,侵刪。

Java異常的處理機制是:拋出異常,捕獲異常
Java異常都是對象,都派生自java.langThrowable類,主要分爲Exception和Error兩類

  1. Error:程序無法處理的嚴重錯誤, 比如OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。
  2. Exception:程序本身可以處理的異常,分爲運行時異常和編譯時異常兩大類。

2. Exception細分

①運行時異常(非檢測異常)

包括很多,比如

  1. IndexOutOfBoundsException
  2. NullPointerException
  3. ArithmeticException
  4. IllegalArgumentException
  5. ClassNotFoundException

    這些異常不需要捕獲的,代碼在編譯階段不會報錯,可以執行。比如常見的代碼如下
public static void main(String[] args) {
    int a = 1, b = 0;
	System.out.println(a / b);
}

②編譯時異常(檢測異常)

這種異常必須拋出或者捕獲,不然代碼編譯不通過。常見的有

  1. IOException
  2. SQLException

3. 異常的捕獲

①. try-catch

public class ArithmeticExceptionDemo {

	public static void main(String[] args) {
		int a = 1;
		int b = 0;
		
		try {
			System.out.println("錯誤:" + a / b);
			System.out.println("無法輸出");
		} catch (ArithmeticException e) {
			System.out.println("aa");
		} catch (RuntimeException e) {
			System.out.println("Runtime");
		}
		
		System.out.println("照樣輸出");
			
	}
}

如這段代碼輸出的結果是

aa
照樣輸出
  1. 在try語句塊中異常的語句不會輸出,其後面的語句更不會執行。
  2. catch可以編寫多個,但是先編寫的必須是子類,需要按小到大來排,不然編譯錯誤,因爲異常最多隻能被一個catch捕獲,其餘的catch沒事幹了。
  3. 最後的 “照樣輸出” 是程序執行異常處理後執行的。

②. try-catch-finally

public class ArithmeticExceptionDemo {

	public static void main(String[] args) {
		int a = 1;
		int b = 0;
		
		try {
			System.out.println("hh");
			return;
		} catch (ArithmeticException e) {
			System.out.println("aa");
		} catch (RuntimeException e) {
			System.out.println("Runtime");
		} finally {
			System.out.println("finally");
		}
		
		System.out.println("照樣輸出");
			
	}
}

輸出爲

hh
finally

finally語句塊是方法返回前必須執行的,也就是輸出了“hh“後,下一條語句不是return;,而是執行finally語句塊

也可以直接使用 try-finally

在這裏插入圖片描述


4. 自定義異常

public class ExceptionTest {

	public static int sum(int a, int b) {
		if (a + b >= 5)
			return a + b;
		else
			throw new MyException("和不能小於5");
	}
	
	public static void main(String[] args) {
		try {
			sum(1, 2);
		} catch (MyException e) {
			System.err.println(e.getMessage());
		}
	}
}

class MyException extends RuntimeException {
	private String message;
	
	public MyException(String error) {
		message = error;
	}
	
	@Override
	public String getMessage() {
		return "拋出異常:" + message;
	}
}

輸出

拋出異常: 和不能小於5

比較簡單,直接繼承某個Exception即可,重寫裏面的一些異常信息方法即可。
使用的時候直接拋出,然後捕獲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章