第九周動手動腦01
運行AboutException.java示例,然後通過後面的幾頁PPT了解Java中實現異常處理的基礎知識。
運行結果:
Java中的異常捕獲語句
Try{
//可能發生運行錯誤的代碼;
}
catch(異常類型 異常對象引用){
//用於處理異常的代碼
}
finally{
//用於“善後” 的代碼
}
把可能會發生錯誤的代碼放進try語句塊中。
當程序檢測到出現了一個錯誤時會拋出一個異常對象。異常處理代碼會捕獲並處理這個錯誤。
catch語句塊中的代碼用於處理錯誤。
當異常發生時,程序控制流程由try語句塊跳轉到catch語句塊。
不管是否有異常發生,finally語句塊中的語句始終保證被執行。
如果沒有提供合適的異常處理代碼,JVM將會結束掉整個應用程序。
Java中的異常分類
Throwable類有兩個直接子類:
Exception:出現的問題是可以被捕獲的;
Error:系統錯誤,通常由JVM處理。
可捕獲的異常又可以分為兩類:
(1)Check異常:直接派生自Exception的異常類,必須被捕獲或再次聲明拋出
(2)Runtime異常:派生自RuntimeException的異常類。使用throw語句可以隨時拋出這種異常對象:
throw new ArithmeticException(…);
請嘗試解釋以下奇怪的現象!
前頁
“finally”的功用
資源泄露:當一個資源不再被某應用程序使用,但此程序並未向系統聲明不再使用此資源時發生這種情況
finally語句塊主要用於解決資源泄露問題,它位於catch語句塊之後,JVM保證它們一定執行。
註意:finally語句塊中也可能發生異常,如果這種情況發生,先前的異常被放棄。
閱讀以下代碼(CatchWho.java),寫出程序運行結果:
結果:
寫出CatchWho2.java程序運行的結果
結果:
當有多個嵌套的try…catch…finally時,要特別註意finally的執行時機。
請先閱讀 EmbedFinally.java示例,再運行它,觀察其輸出並進行總結。
特別註意:
當有多層嵌套的finally時,異常在不同的層次拋出 ,在不同的位置拋出,可能會導致不同的finally語句塊執行順序。
結果:
辨析:finally語句塊一定會執行嗎?
請通過 SystemExitAndFinally.java示例程序回答上述問題
不會,如果在catch語句,或者try語句中執行了System.exit(0)語句則直接退出程序
當程序中出現異常時,JVM會依據方法調用順序依次查找有關的錯誤處理程序。
可使用printStackTrace 和 getMessage方法了解異常發生的情況:
printStackTrace:打印方法調用堆棧。
每個Throwable類的對象都有一個getMessage方法,它返回一個字串,這個字串是在Exception構造函數中傳入的,通常讓這一字串包含特定異常的相關信息。
異常的總結:
java異常分為異常和錯誤,Exception和Error,兩個類,者這兩個類都繼承自Throwable類,Throwable是所有java異常的根。
java所有的異常類包括Throwable,Exception,Error都是類,所以都是可以實例化的(筆試經常會遇到)
Error:不能被程序很好處理的錯誤(cannot be handled reasonably by program)
機器的內存不夠了
JVM崩潰了(是程序都有可能掛掉)
線程掛掉了
…
Exception:可以被程序處理的(can be handled by program)
IO錯誤(鍵盤,磁盤)
網絡錯誤
不合法的類型轉換
數組或者容器越界
java的異常一般會分為運行時異常和非運行時異常
運行時異常就是RunTimeException的所有子類
非運行時異常就是Exception的其他所有孩子類,比如IOException,InterruptedException
Java中關於異常的類主要在java.lang.*;和java.io.*;中
第九周動手動腦01