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

第九周動手動腦01

退出程序 一個 row 好處 匯編 類型 筆試 bsp 1-1

運行AboutException.java示例,然後通過後面的幾頁PPT了解Java中實現異常處理的基礎知識。

運行結果:

技術分享

Java中的異常捕獲語句

Try{

//可能發生運行錯誤的代碼;

}

catch(異常類型 異常對象引用){

//用於處理異常的代碼

}

finally{

//用於“善後” 的代碼

}

把可能會發生錯誤的代碼放進try語句塊中。

當程序檢測到出現了一個錯誤時會拋出一個異常對象。異常處理代碼會捕獲並處理這個錯誤。

catch語句塊中的代碼用於處理錯誤。

當異常發生時,程序控制流程由try語句塊跳轉到catch語句塊。

不管是否有異常發生,finally語句塊中的語句始終保證被執行。

如果沒有提供合適的異常處理代碼,JVM將會結束掉整個應用程序。

Java中的異常分類

Throwable類有兩個直接子類:

Exception:出現的問題是可以被捕獲的;

Error:系統錯誤,通常由JVM處理。

可捕獲的異常又可以分為兩類:

1Check異常:直接派生自Exception的異常類,必須被捕獲或再次聲明拋出

2Runtime異常:派生自RuntimeException的異常類。使用throw語句可以隨時拋出這種異常對象:

throw new ArithmeticException();

請嘗試解釋以下奇怪的現象!

技術分享

技術分享

技術分享

技術分享

前頁

PPT中所出現之奇怪現象,可以使用javap去反匯編兩個示例程序的.class文件(一個是AboutException.class,另一個是ThrowDemo.class),從中你會有所發現的。

技術分享

技術分享

finally”的功用

資源泄露:當一個資源不再被某應用程序使用,但此程序並未向系統聲明不再使用此資源時發生這種情況

finally語句塊主要用於解決資源泄露問題,它位於catch語句塊之後,JVM保證它們一定執行。

註意:finally語句塊中也可能發生異常,如果這種情況發生,先前的異常被放棄。

閱讀以下代碼(CatchWho.java),寫出程序運行結果:

技術分享

結果:

技術分享

寫出CatchWho2.java程序運行的結果

技術分享

結果:

技術分享

當有多個嵌套的trycatchfinally時,要特別註意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