java異常繼承圖

- Throwable 類是 Java 語言中所有錯誤或異常的超類。隻有當對象是此類(或其子類之一)的執行個體時,才能通過 Java 虛拟機或者 Java throw 語句抛出。類似地,隻有此類或其子類之一才可以是 catch 子句中的參數類型。 (來自jdk文檔)
- Error一般是程式或者系統中比較嚴重的錯誤,隻能通過重寫代碼等去解決。
- 異常又分為編譯時異常(eg:ClassNotFoundException類找不到異常,FileNotFoundException檔案找不到異常,SQLException sql異常等)和運作時異常(NullPointerException空指針異常,AirthmeticException運算非法異常,IndexOutOfBoundsException數組越界異常等)。
- 除了RuntimeException類及其之類外,所有的異常都是編譯期異常,編譯期的異常是我們必須進行顯示處理的,如果不處理程式就無法繼續編譯執行。
- 運作期異常,我們可以不進行顯示處理,也可以進行顯示處理,不會影響程式的編譯。如下圖中的異常是可以通過編譯的,在運作時才會報出錯誤。
java基礎總結之java異常 - 我是這樣了解運作時異常的,運作時異常就相當于一些小錯誤,不至于導緻系統崩潰,隻要我們在寫代碼時足夠的嚴謹,就可以避免這些錯誤。(例如以下的代碼,我們在進行除法運算之前,先判斷除數是否為0,不為0才進行運算,這樣就可以避免除數為0帶來的錯誤)
java基礎總結之java異常 -
JVM對異常的處理:
如果在程式中出現問題,而我們不去處理,最終會由jvm做出預設的處理(把異常的名稱,原因,問題相關的資訊列印在控制台,同時結束程式),當我們對可能出現異常的部分進行了異常處理,那麼程式就會繼續運作下去。如下圖,我們對做除法運算的語句進行了異常處理,它後面的代碼int d=a+b正常的執行了,并且printStackTrace()方法給出了錯誤的資訊。
java基礎總結之java異常
異常的處理方案:
- 1.throws抛出異常
- 2.try…catch捕獲異常
- try …catch語句通常寫法:
try {
//可能出現問題的語句代碼
}catch (異常名 變量) {
//針對問題的處理
}finally {
//必須執行的代碼(如:釋放資源)
}
- 當需要處理多個異常時的變形寫法:
try {
//可能出現問題的語句代碼
//語句1
//語句2
}catch (異常名 變量) {
//針對問題的處理
}catch(異常名 變量){
//針對問題的處理
}
...
注意:
- try裡面的語句越少越好
- catch裡面必須有内容,至少有簡單點的提示語句
- 在catch中異常名寫的原則:能明确的異常不要寫其父類的異常名。
- 多個catch之間平級的異常先後順序沒有關系,但是當出現父子關系時,父類的異常寫在最後。
- 存在多個catch的執行規則:一旦try裡面的語句出現錯誤,就會将問題抛出去,和catch裡面的異常進行比對,執行catch裡面的處理,然後try…catch就結束了,轉而執行後面的代碼。(如上面的語句1出現了問題,就會找對應的catch塊,語句2就得不到執行)
- 變形寫法2:(jdk1.7後)
try {
}catch (異常名1|異常名2|異常名3|...) {
}
這種寫法異常名之間必須是平級的關系。
throws處理方式:
- 一般當我們沒有權限或者我們處理不了某些異常時,才會選擇使用throws的方案。
- 使用方法:在方法的聲明上抛出,用于告訴調用者,我這裡出現問題了,并由調用者來處理該異常。如下所示:
public void method() throws Exception{
}
-
throw和throws的差別:
throws 用在方法聲明後,可以跟多個異常名,表示将異常抛出,由方法的調用者來處理。throws表示出現異常的一種可能性,并不一定發生這種異常。
throw 在方法體内抛出,跟異常名對象,隻能一個,表示抛出異常,執行throw則一定抛出了某種異常。
public class MyException {
public void method(){
int a = 10;
int b = 0;
if (b == 0)
throw new ArithmeticException();
else
System.out.println(a/b);
}
public static void main(String[] args) {
MyException me=new MyException();
me.method();
}
}
運作結果:
-
finally
被finally控制的語句一定執行(但如果在finally執行之前jvm就退出了,finally中的代碼不會被執行)
(個人學習總結,僅供參考,有錯請指正,謝謝)