Java 如何拋出異常、自定義異常、手動或主動拋出異常


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM