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

第八週動手動腦

動手動腦一:

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