1. 程式人生 > 其它 >異常體系以及try..catch,finally,throw,throws的使用

異常體系以及try..catch,finally,throw,throws的使用

技術標籤:學習筆記java

文章目錄


前言

首先,我們今天一起聊一下java中的異常體系

一、什麼是異常機制

首先,在Java中,當所寫程式碼不符合某些邏輯思想上規定,進而在JVM執行期間系統會自動將不符合邏輯的程式碼進行一系列的處理,從而使使用者可以及時去確定出現問題的位置

,這就是異常機制。

(換句話來說,當我們發現程式碼出現邏輯思想上的不規範時,我們是不是可以通過新增一些條件使邏輯不出錯,但會效能會降低,消耗也會增大,從而我們可以藉助異常類對其進行邏輯上的判斷和檢測)。

Throwable類中包含了異常(Exception類),和錯誤(Error類)

二、異常的分類

1.RuntimeException類 和 繼承Exception的其他子類

首先,所有的異常子類都繼承Exception父類

Java機制中,可分為RuntimeException類繼承Exception的其他子類

常見的RuntimeException類的異常子類

1.NullPointerException(空指標異常)

2.IndexOutOfBoundsException(下標超出異常)

3.IllegalArgumentException(引數不合法異常)

4.NumberFormatException(數字格式化異常)

5.ClassCastException(型別轉換異常)

6.ArithemticException(算術邏輯異常)

常見的繼承Exception類的其他子類
1.SQLException

2.IOException

2.No Checked異常 和 Checked異常

No Checked異常:JVM可以進行簡單的處理,使得該類異常可以使用try…catch捕獲,throw丟擲異常

也可以不用

No Checked異常:RuntimeException異常


Checked異常:該類異常必須要進行 throw丟擲異常和try…catch捕獲。

Checked異常:SQLException類 IOException類

三、try…catch , finally;throw;throws

1.try…catch 和 finally

try:用於儲存可能出現異常的程式碼
執行時,如果jvm檢測到程式碼異常,則建立一個和該異常相關的物件,並且程式碼的執行流程會跳過後面的try中的程式碼,進入catch塊中執行。

catch:進行捕獲異常,根據jvm建立的異常物件和catch塊中的異常型別進行匹配,成功則執行程式碼塊的內容。(利用 instanceof 運算子進行型別匹配)

finally:無論是否出現異常或return,都執行,除非在之前有System.exit(0)=>虛擬機器退出

在try…catch之外的程式碼,若沒有reuturn語句,則執行其程式碼;

public class Demo05 {
	public static void main(String[] args) {
		try {
			int num1=12,num2=6;
			int result=num1/num2;
			System.out.printf("%d÷%d=%f\n",num1,num2,result);
			
			String str=null;
			System.out.println(str.length());
		}catch(ArithmeticException ex){ 
			System.out.println("除數不能為零");
			ex.printStackTrace();  //列印當前異常的堆疊資訊
		}catch(NullPointerException ex) {
			System.out.println("不能訪問一個Null物件的方法哦");
			//return;
			//System.exit( 0);
		}catch(IllegalFormatConversionException ex) {
			System.out.println("注意格式化佔位符的對應關係鴨!");
		}catch(Exception ex) {
			System.out.println("哎喲,出錯了鴨!!!");
		}finally {
			System.out.println("finally.............");
		}
		System.out.println("程式結束");
	}
}

2.throw 和 throws

快捷鍵:Alt+Shift+z

throws:將宣告異常型別丟擲到該方法名之後

throw:用於建立丟擲的異常物件,放於方法體內。

若丟擲的異常物件為No Checked異常,可以使用try…catch捕獲,throw丟擲異常也可以不用

若丟擲的異常物件為Checked異常,必須使用try…catch捕獲,throw丟擲異常

public class Demo07 {
	public static void main(String[] args) {
		try {
			dosth();
		} catch (FileNotFoundException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
	}
	public static void dosth() throws FileNotFoundException{
		int a=23,b=3;
		if(a>b) {
			throw new FileNotFoundException(); //No Checked異常
		}
	}

四 自定義丟擲

當系統的異常類不足以按照自己的想法去實現,則自定義丟擲可以解決這個問題
步驟:
1.建立一個自定義的異常類,並繼承某個父類,這裡繼承RuntimeException類,利用 super關鍵字,將引數傳入到父類進行一系列操作
2.利用throw建立一個自定義的異常型別物件,可以傳入引數,
3.使用throws將異常型別丟擲到該方法外
4.在主函式進行對異常的捕獲

注意:
1.若是自定義異常類繼承Exception,(No Check異常),可以處理該異常

2.若是自定義異常類繼承RuntimeException(Check異常),必須處理也可以不處理該異常

package com.apesource.exception;

public class Demo08 {
	public static void main(String[] args) {
		try {
			donothing();
		} catch (CountTooLargeException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		} 
	}
	//自定義異常
	public static void donothing() throws CountTooLargeException {
		int count=9999;
		if(count>999) {
			//建立並丟擲自定義異常物件
			//throw new CountTooLargeException();  //使用無參構造方法建立,採用預設提示資訊
			throw new CountTooLargeException("商品數量過大");  //使用有參構造方法建立,採用自定義提示資訊
		}
	}
}

class CountTooLargeException extends RuntimeException{
	public CountTooLargeException(String message) {
		super(message);
	}

上述就是今天的內容,讓我們一起學習,要是有不對的地方,還請大家幫忙指正呀。加油,兄弟們。