第八週動手動腦
動手動腦一:
請閱讀並執行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語句才不執行。