Java 異常處理 之 手動拋出異常


一、手動拋出異常 throw

  在編寫程序時,我們必須要考慮程序出現問題的情況。比如,在定義方法時,方法需要接受參數。那么,當調用方法使用接受到的參數時,首先需要先對參數數據進行合法的判斷,數據若不合法,就應該告訴調用者,傳遞合法的數據進來。這時需要使用拋出異常的方式來告訴調用者 。

  Java 異常類對象除在程序執行過程中出現異常時由系統自動生成並拋出,也可以根據需要使用人工創建並拋出。

  在java中,提供了一個 throw 關鍵字,它用來拋出一個指定的異常對象。 在當前方法中不處理,拋給調用者處理。

    異常的對象的創建和拋出有兩種方式:

    (1)JVM 創建並拋出

    (2)手動 new 出來,然后由 throw 拋出。

  Throwable:

    只有當對象是此類(或其子類之一)的實例時,才能通過 Java 虛擬機或者 Java throw 語句拋出。

    類似地,只有此類或其子類之一才可以是 catch 子句中的參數類型。 

  手動拋出異常對象:

    (1)首先要生成異常類對象,然后通過 throw 語句實現拋出操作(提交給 Java 運行環境)

IOException e = new IOException();
throw e;

  

    (2)可以拋出的異常必須是 Throwable 或其子類的實例。下面的語句在編譯時將會產生語法錯誤:

throw new String("want to throw");

  

二、拋出異常

  1、實現步驟

    (1)創建一個異常對象。封裝一些提示信息(信息可以自己編寫)

    (2)需要將這個異常對象告訴給調用者。通過關鍵字 throw 就可以完成。throw 異常對象。

      throw 關鍵字作用:用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,並結束當前方法的執行。 
  使用格式:

throw new 異常類名("異常產生的原因");

  注意:

   (1)throw 關鍵字必須寫在方法的內部

   (2)throw 關鍵字后邊 new 的對象必須是 Exception或者Exception的子類對象

   (3)throw 關鍵字拋出指定的異常對象,我們就必須處理這個異常對象

      throw 關鍵字后邊創建的是RuntimeException或者是 RuntimeException的子類對象,我們可以不處理,默認交給JVM處理(打印異常對象,中斷程序)
      throw 關鍵字后邊創建的是編譯異常(寫代碼的時候報錯),我們就必須處理這個異常,要么throws,要么try...catch

  2、throw 與 throws 區別

     面試題:throw 與 throws 有什么區別?

      (1)throw 用於手動拋出異常對象,是個可執行的語句

      (2)throws:在方法簽名中,聲明方法可能拋出什么異常,讓調用者來處理這些異常。

  3、代碼示例

 1 // 主方法
 2  public static void main(String[] args) { 3         //int[] arr = null;
 4         int[] arr = new int[3]; 5         int e = getElement(arr,3); 6 System.out.println(e); 7 } 8 // 定義一個方法,獲取數組指定索引處的元素
 9 public static int getElement(int[] arr,int index){ 10         /* 11 我們可以對傳遞過來的參數數組,進行合法性校驗 12 如果數組arr的值是null 13 那么我們就拋出空指針異常,告知方法的調用者"傳遞的數組的值是null" 14 */
15         if(arr == null){ 16             throw new NullPointerException("傳遞的數組的值是null"); 17 } 18 
19         /* 20 我們可以對傳遞過來的參數index進行合法性校驗 21 如果index的范圍不在數組的索引范圍內 22 那么我們就拋出數組索引越界異常,告知方法的調用者"傳遞的索引超出了數組的使用范圍" 23 */
24         if(index<0 || index>arr.length-1){ 25             /* 26         判斷條件如果滿足,當執行完throw拋出異常對象后,方法已經無法繼續運算。 27         這時就會結束當前方法的執行,並將異常告知給調用者。這時就需要通過異常來解決。 28         */
29             throw new ArrayIndexOutOfBoundsException("傳遞的索引超出了數組的使用范圍"); 30 } 31 
32         int ele = arr[index]; 33         return ele; 34 } 35     

 

   注意:NullPointerException、ArrayIndexOutOfBoundsException 是一個運行期異常,我們不用處理,默認交給JVM處理。

   Tips如果產生了問題,我們就會throw將問題描述類即異常進行拋出,也就是將問題返回給該方法的調用者。 對於調用者,有兩種解決方式:一種是進行捕獲處理,另一種就是繼續將異常聲明出去,使用 throws 聲明處理。

 

  4、擴展:Objects 非空判斷

Objects 是由一些靜態的使用方法組成,這些方法是 null-save(空指針安全的)或 null-tolerant(容忍空指針的),那么在它的源碼中,對對象的null 值進行了拋出異常操作。

public static <T> T requireNonNull(T obj) :查看指定引用對象不是null。

    源碼:

 public static <T> T requireNonNull(T obj) {
      if (obj == null)
           throw new NullPointerException();
        return obj;
  }

    這樣,當我們需要對傳遞過來的參數進行合法判斷,判斷是否為 null的時候,可以直接使用 該方法即可。

  Demo:

1 public static void method(Object obj){
2         //對傳遞過來的參數進行合法性判斷,判斷是否為null
3         /*if(obj == null){
4             throw new NullPointerException("傳遞的對象的值是null");
5         }*/
6 
7         //Objects.requireNonNull(obj);
8         Objects.requireNonNull(obj,"傳遞的對象的值是null");   // 方法重載
9 }

 


免責聲明!

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



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