一、手動拋出異常 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 }