Java 異常學習

在JVM遇到異常的時候,先是在當前方法中尋找catch代碼塊,如果找到了就執行該代碼塊;否則,JVM會從調用棧中彈出該方法的棧結構,繼續到前一個方法中查找合適的catch代碼塊。


正常情況下try catch塊語句不會對程序的性能造成很大影響,比如try catch塊在同一個地方(方法)裏就影響不大;但是如果JVM必須搜索方法調用棧來尋找catch塊的時候,那麼開銷就很大了。

所以,不應該使用異常處理機制來控制程序流程,而應該確保僅僅在程序中可能出現異常的地方使用try catch塊。並且,能夠自己處理的異常,應該儘量自己處理。


語法規則要點:

1.try代碼塊後面可以有零個或多個catch塊,還可以有零個或至多一個finally塊,二者至少有其一,也就是try後面可以只跟一個finally,而沒有catch。

2.在try代碼塊中定義的變量作用域僅僅爲try代碼塊。

3.throw後面不允許緊跟其他語句,因爲它們永遠都沒有機會執行。

4.finally不被執行的唯一情形是先執行了System.exit()方法。

5.在執行try或catch中的return語句時,如果有finally塊,則要先執行finally塊,然後再返回。

6.finally不能通過重新給變量賦值的方法來改變return的返回值。如:

int a=0;
try{
    return a;
}finally{
    a=1;
}


7.不要再finally中使用return,因爲這會覆蓋掉try和catch中的return。此外,finally中的return,還會導致catch裏throw的異常丟失。


Throwable類有兩個子類:Error和Exception

Error表示嚴重的錯誤,比如方法調用棧溢出和內存不足等。

Exception表示程序本身可以處理的異常。


Exception又分爲運行時異常和受檢查異常

RuntimException就是Java編譯器不會檢查的異常。即使沒有try catch,沒有throws,還是會編譯通過。

受檢查異常就是編譯器會檢查的異常。


Error和RuntimeException都會導致程序的終止,編譯器也都不會檢查他們。

它們的區別是一般不會擴展Error類來創建用戶自定義的錯誤類,而RuntimeException經常會被擴展。


當位於最上層的子系統不需要關心來自底層的異常的細節的時候,常見的做法是捕獲原始異常,把它轉換爲一個新的不同類型的異常,再拋出新的一場。這種處理異常的方式成爲異常轉譯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章