1. 程式人生 > >第八周動手動腦

第八周動手動腦

jvm 子類 返回 特定 gif 傳播 nal 兩個 ack

動手動腦一:

請閱讀並運行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語句才不執行。

第八周動手動腦