第八周動手動腦
動手動腦一:
請閱讀並運行AboutException.java示例
AboutException.java答:
結論:
異常 (Exception):發生於程序執行期間,表明出現了一個非法的運行狀況。許多JDK中的方法在檢測到非法情況時,都會拋出一個異常對象。
例如:數組越界和被0除
動手動腦二:多層的異常捕獲-1
閱讀以下代碼(CatchWho.java),寫出程序運行結果:
CatchWho
答:運行結果:
ArrayIndexOutOfBoundsException/內層try-catch
發生ArithmeticException
動手動腦二:多層的異常捕獲-2
閱讀以下代碼(CatchWho.java),寫出程序運行結果:
CatchWho2答:運行結果:
ArrayIndexOutOfBoundsException/外層try-catch
動手動腦三:
請先閱讀 EmbedFinally.java示例,再運行它,觀察其輸出並進行總結。
EmbededFinally
答:運行結果:
異常清除之前:
Exception in thread "main" java.lang.Error: 無法解析的編譯問題:
標記“.”上有語法錯誤,刪除此標記
at ceshi.CatchWho2.main(CatchWho2.java:70)
異常清除之後:
in Level 1
in Level 2
in Level 3
Level 3:class java.lang.ArithmeticException
In Level 3 finally
In Level 2 finally
In Level 1 finally
總結::當有多層嵌套的finally時,異常在不同的層次拋出,在不同的位置拋出,可能會導致不同的finally語句塊執行順序
動手動腦三:
辨析:finally語句塊一定會執行嗎?
請通過 SystemExitAndFinally.java示例程序回答上述問題
SystemExitAndFinally答:運行結果:
in main
Exception is thrown in main
結論:
1.只有與 finally 相對應的 try 語句塊得到執行的情況下,finally 語句塊才會有執行的前提條件。
2.如果在 try 語句塊中執行了 System.exit (0) 語句,終止了 Java 虛擬機的運行,finally 語句塊也不可以執行。
3.當一個線程在執行 try 語句塊或者 catch 語句塊時被打斷(interrupted)或者被終止(killed),與其相對應的 finally 語句塊可能不會執行。
4.更極端的情況,就是在線程運行 try 語句塊或者 catch 語句塊時,突然死機或者斷電,finally 語句塊肯定不會執行了。
知識點:如何跟蹤異常的傳播路徑?
1.當程序中出現異常時,JVM會依據方法調用順序依次查找有關的錯誤處理程序。
2.可使用printStackTrace 和 getMessage方法了解異常發生的情況:
3.printStackTrace:打印方法調用堆棧。
4.每個Throwable類的對象都有一個getMessage方法,它返回一個字串,這個字串是在Exception構造函數中傳入的,通常讓這一字串包含特定異常的相關信息。
歸納與總結
依據對本講多個示例程序的分析,請自行歸納總結出Java多層嵌套異常處理的基本流程。
答:
Java中異常分類:
Throwable類有兩個直接子類:
Exception:出現的問題是可以被捕獲的;
Error:系統錯誤,通常由JVM處理。
可捕獲的異常又可以分為兩類:
(1)Check異常:直接派生自Exception的異常類,必須被捕獲或再次聲明拋出
(2)Runtime異常:派生自RuntimeException的異常類。使用throw語句可以隨時拋出這種異常對象:
throw new ArithmeticException(…);
處理流程:
1.try語句嵌套從外層到內層執行,在try語句中,哪一層出錯,哪一層就拋出異常,該層後邊的try語句就不再執行,如果該層存在catch就進行相應的捕獲,且內層try中嵌套的try-catch語句外部如果還有語句會繼續執行;如果該層沒有catch進行捕獲,就向外拋出,如果外部try-catch語句中也沒有catch進行捕獲,就終止程序。
2.try-catch-finally語句嵌套時,內層try拋出異常,即使catch沒有捕捉到拋出的異常,內層的finally也一樣會執行,然後異常繼續向外拋出,除非遇到極特殊的System.exit(0)在finally語句之前的try-catch中,finally語句才不執行。
第八周動手動腦