public static void main(String[] args) { try { throw new Exception("拋出異常"); } catch (Exception e) { e.printStackTrace(); System.out.println("捕獲異常"); } }
控制台打印的信息
java.lang.Exception: 拋出異常
捕獲異常
at com.pbh.util.jwt.JWTUtil.main(JWTUtil.java:31)
一、異常的拋出
1、定義 : 一個方法不處理這個異常,而是調用層次向上傳遞,誰調用這個方法,這個異常就由誰來處理。
2、throw : 將產生的異常拋出(強調的是動作),拋出的既可以是異常的引用,也可以是異常對象。(位置: 方法體內)
3、throws : 如果一個方法可能會出現異常,但沒有能力處理這種異常,可以在方法聲明處用throws子句來聲明拋出異常。用它修飾的方法向調用者表明該方法可能會拋出異常(可以是一種類型,也可以是多種類型,用逗號隔開)(位置: 寫在方法名 或方法名列表之后 ,在方法體之前。)
注意 : 調用可能會拋出異常的方法,必須添加try-catch代碼塊嘗試去捕獲異常 或者 添加throws 聲明 來將異常 拋出給更上一層的調用者進行處理,這里需要注意一個細節:新的異常包含原始異常的所有信息,根據這個我們可以去追溯最初異常發生的位置,
如下圖所示
4、簡單使用
// 定義一個方法,拋出 數組越界和算術異常(多個異常 用 "," 隔開) public void Test1(int x) throws ArrayIndexOutOfBoundsException,ArithmeticException{ System.out.println(x); if(x == 0){ System.out.println("沒有異常"); return; } //數據越界異常 else if (x == 1){ int[] a = new int[3]; a[3] = 5; } //算術異常 else if (x == 2){ int i = 0; int j = 5/0; } }
在main方法中調用
public static void main(String[] args) { //創建對象 ExceptionInital object = new ExceptionInital(); // 調用會拋出異常的方法,用try-catch塊 try{ object.Test1(0); }catch(Exception e){ System.out.println(e); } // 數組越界異常 try{ object.Test1(1); }catch (ArrayIndexOutOfBoundsException e) { System.out.println("數組越界異常:"+e); } // 算術異常 try{ object.Test1(2); }catch(ArithmeticException e){ System.out.println("算術異常:"+e); } //使用 throw 拋出異常(可以拋出異常對象,也可以拋出異常對象的引用) try{ ArrayIndexOutOfBoundsException exception = new ArrayIndexOutOfBoundsException(); throw exception;//new ArrayIndexOutOfBoundsException(); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("thorw拋出異常:"+e); } }
運行結果
總結下 throw 和throws 關鍵字的區別
1、寫法上 : throw 在方法體內使用,throws 函數名后或者參數列表后方法體前
2、意義 : throw 強調動作,而throws 表示一種傾向、可能但不一定實際發生
3、throws 后面跟的是異常類,可以一個,可以多個,多個用逗號隔開。throw 后跟的是異常對象,或者異常對象的引用。
4、throws 用戶拋出異常,當在當前方法中拋出異常后,當前方法執行結束(throws 后,如果有finally語句的話,會執行到finally語句后再結束。)。可以理解成return一樣。
二、自定義異常
前面所講的異常,都是系統自帶的,系統自己處理,但是很多時候項目會出現特有問題,而這些問題並未被java所描述並封裝成對象,所以對於這些特有的問題可以按照java的對問題封裝的思想,將特有的問題進行自定義異常封裝。在Java中要想創建自定義異常,需要繼承Throwable或者他的子類Exception。
語法
class 自定義異常類 extends 異常類型(Exception){ // 因為父類已經把異常信息的操作都完成了,所在子類只要在構造時,將異常信息傳遞給父類通過super 語句即可。 // 重寫 有參 和 無參 構造方法 }
例如:
public class CustomException extends Exception { //無參構造方法 public CustomException(){ super(); } //有參的構造方法 public CustomException(String message){ super(message); } // 用指定的詳細信息和原因構造一個新的異常 public CustomException(String message, Throwable cause){ super(message,cause); } //用指定原因構造一個新的異常 public CustomException(Throwable cause) { super(cause); } } // 備注: 這些方法怎么來的? 重寫父類Exception的方法,那么如何查看Exception具有哪些API,快捷鍵:選中Exception, command+單擊。windows系統 :選中Exception, control+單擊。
自定義異常的使用例子:
自定義test1()方法,拋出 “我喝酒了”的異常信息,test2()方法調用test1()方法,並將異常包裝成RuntimeException類型的異常,繼續拋出,在main方法中調用test2()方法,並嘗試捕獲異常
public void test2() { try{ test1(); }catch (CustomException e){ RuntimeException exception = new RuntimeException(e); //exception.initCause(cause) throw exception; } } public void test1() throws CustomException{ throw new CustomException("我喝酒了"); } // main方法 public static void main(String[] args) { CustomExceptionInital object = new CustomExceptionInital(); //try{ object.test2(); //}catch(Exception e){ //e.printStackTrace(); //} }
輸出結果:
參考:https://blog.csdn.net/qq_18505715/article/details/73196421