(1)因為項目中會出現特有的問題,
而這些問題并未被java所描述并封裝對象
是以對于這些特有的問題可以按照java的對問題封裝的思想。
将特有的問題,進行自定義的異常封裝
(2) 當函數内部出現了throw抛出異常對象,那麼就必須要給對應的處理動作。
要麼在内部try catch處理
要麼在函數上聲明讓調用者處理
一般情況下,函數内出現異常,函數上需要聲明
(3) 發現列印的結果隻有異常的名稱,卻沒有異常的資訊,因為自定義的異常并未定義資訊
因為父類中已經把異常資訊的操作都完成了,是以子類隻要在構造時候,将
異常資訊傳遞給父類通過super語句
那麼就可以直接通過getMessage方法獲得異常資訊。
(4)自定義異常:
必須是自定義類繼承Exception
(5)繼承Exception原因:
異常體系有一個特點:因為異常類和異常對象被抛出,他們都具備可抛型,
這個可抛型是Throwable這個體系中的獨有特點,
(6)隻有這個體系中的類和對象可以被throw和throw操作
a.throws和throw的差別
throw使用在函數上,
throw使用在函數内。
throw後面跟的異常類,可以跟多個,用逗号隔開
throw 後面跟的是異常對象
(7)Exception中有一個特殊 的子類異常RuntimeException運作時異常
如果在函數内容抛出該異常,函數可以不用聲明,編譯一樣通過
如果在函數上聲明了該異常,調用者可以不用進行處理,編譯一樣通過
之是以不用在函數聲明,是因為不需要讓調用者處理,當該異常發送,希望程式停止,
因為在運作時候,出現了無法繼續運算的情況,希望停止程式後,對代碼進行修正
(8)自定義異常時候:如果該異常的發送,無法在繼續進行運算,
就讓自定義異常繼承RuntimeException
(9)對于異常分兩種:
1.編譯時被檢測的異常
2.編譯時不被檢測的異常(運作時候異常,RuntimeException以及其子類)
在本程式中,對于除數是負數,也視作錯誤的,無法進行運算,那麼就需要對這個問題進行自定義的描述
class FuShuException extends RuntimeException {// getMessage
private int value;
FuShuException() {
super();
}
FuShuException(String msg, int value) {
// TODO Auto-generated constructor stub
super(msg);
this.value = value;
}
public int getValue() {
return value;
}
}
class Demo {
int div(int a, int b) {
if (b < 0) {
throw new FuShuException("出現了除數是負數的情況/by 負數", b);// 手動通過throw抛出異常
}
if (b == 0) {
throw new ArithmeticException("被0除了");
}
return a / b;
}
}
public class ExceptionByIden {
public static void main(String[] args) {
Demo demo = new Demo();
int x;
try {
x = demo.div(4, -1);
System.out.println("x = " + x);
} catch (FuShuException e) {
System.out.println(e.toString());
System.out.println("除數出現負數");
System.out.println("錯誤的負數是:" + e.getValue());
} catch (Exception e) {
System.out.println(e.toString());
}
System.out.println("over");
}
}