異常的注意事項
阿新 • • 發佈:2021-07-29
異常的注意事項
多個異常使用捕捉又該如何處理:
1.多個異常分別處理
2.多個異常一次捕獲,多次處理
3.多個異常一次捕獲一次處理
多個異常分別處理
public class moreException { public static void main(String[] args) { try { int[] arr={1,2,3}; System.out.println(arr[3]); }catch (ArrayIndexOutOfBoundsException e){ System.out.println(e); } try { List<Integer> list = List.of(1, 2, 3); System.out.println(list.get(3)); }catch (IndexOutOfBoundsException e){ System.out.println(e); } System.out.println("後續程式碼"); } } /*java.lang.ArrayIndexOutOfBoundsException: 3 java.lang.IndexOutOfBoundsException: Index 3 out-of-bounds for length 3 後續程式碼*/
多個異常一次捕獲,多次處理
注意:只會彈出丟擲的第一個異常
public class moreException { public static void main(String[] args) { try { int[] arr={1,2,3}; System.out.println(arr[3]); List<Integer> list = List.of(1, 2, 3); System.out.println(list.get(3)); }catch (ArrayIndexOutOfBoundsException e){ System.out.println(e); }catch (IndexOutOfBoundsException e){ System.out.println(e); } System.out.println("後續程式碼"); } }//java.lang.ArrayIndexOutOfBoundsException: 3 //後續程式碼
注意事項:catch裡邊定義的異常變數,如果有子父類關係,那麼子類的異常變數必須寫在上面,否則會報錯。 ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException
多個異常一次捕獲一次處理
要點:只寫一個catch語句,裡面是其他異常變數的超類
public class moreException { public static void main(String[] args) { try { int[] arr={1,2,3}; System.out.println(arr[3]); List<Integer> list = List.of(1, 2, 3); System.out.println(list.get(3)); }catch (IndexOutOfBoundsException e){ System.out.println(e); } System.out.println("後續程式碼"); } }
-
執行時異常被丟擲考科一不處理,既不捕獲也不宣告丟擲。
-
如果finally中有return語句,永遠返回finally中的結果,要避免該情況。
-
如果父類丟擲了多個異常,子類重寫父類方法時,丟擲和父類相同的異常或者是父類異常的子類,或者不丟擲異常。
-
父類沒有丟擲異常,子類重寫父類該方法是也不可丟擲異常。此時子類產生該異常,只能捕獲處理,不能宣告丟擲。
-
在try/catch後可以追加finally程式碼塊,其中的程式碼一定會被執行,通常用於資源回收。
public class Fu {
public void show01() throws NullpointerException,classcastException{}
public void show02() throws IndexoutOfBoundsException{}
public void show03() throws IndexOutOfBoundsException{}
public void show04(){}
class zi extends Fu{
//子類重寫父類方法時,丟擲和父類相同的異常
public_void show01() throws NullPointerException,classcastException{}
//子類重寫父類方法時,丟擲父類異常的子類
public void show02() throws ArrayIndexoutOfBoundsException{}
//子類重寫父類方法時,不丟擲異常
public void showe3(){}
/*父類沒有丟擲異常,子類重寫父類該方法是也不可丟擲異常。*/
public void show04()
/*此時子類產生該異常,只能捕獲處理,不能宣告丟擲*/
public void show(){
try{
throw new Exception("編譯期異常");
}catch(Exception e){
e.printStackTrace();
}
}
}
自定義異常
格式:
public class XXXException extends Exception / RuntimeException{
新增一個空參的構造方法
新增一個帶異常資訊的構造方法
}
注意:
1.自定義異常類一般都是一Exception結尾,說明該類是一個異常類
2.自定義異常類,必須繼承Exception或者RuntimeException
繼承Exception:那麼自定義的異常類就是一個編譯期異常,如果方法內部丟擲了編譯期異常,就必須
處理這個異常,要麼throws,要麼try...catch
繼承RuntimeException:那麼自定義的異常類就是一個執行期異常,無需處理,交給JVM處理(中斷處理)
public class MakeException extends Exception{
//新增一個空參的構造方法
public MakeException(){
super();
}
/*新增一個帶異常資訊的構造方法
檢視原始碼發現,所有的異常類都會有一個帶異常資訊的構造方法,方法內部會呼叫父類帶異常資訊
的構造方法,讓父類來處理這個異常資訊。*/
public MakeException(String message){
super(message);
}
}