dff
------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------
經常寫程序的人對try...catch...finally語句肯定是不陌生的了。但是好多人總對異常搞不太清楚,不知道這個異常什么意思,不知道為什么用這個異常處理,這篇博客為大家從本質上剖析一下java中的異常處理的工作原理。
一、定義在《java編程思想》中這樣定義異常:阻止當前方法或作用域繼續執行的問題。
這是書面上的語言,翻譯成我們自己的語言其實就是程序運行出現了問題。具體一點說就是程序運行出現了問題,可能會導致程序運行機制。所以就要通過拋出異常的方式告訴開發者哪里出現了問題。
二、異常體系1、既然產生了問題就要解決問題,就像是人生病了要對癥下藥一樣,java中同樣給我們一系列的異常處理類。那么這些類要如何區分?
總的來說,java中的異常有兩種,一種是Error,一種是Exception。
error一般不可以處理也叫錯誤,Exception一般可以處理。
2、Exception分類
而Exception又可以分兩類,一類是運行時異常,一類是編譯時異常。
a.運行時異常:
都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。
運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
b.非運行時異常(編譯異常):
是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

注意:java中Exception和Error的子類名都是以父類名作為后綴。
三、自定義異常類既然java中的異常處理都是調用預先建好的類,那么我們可不可以自定義異常類呢?答案是肯定的。
1 class CeshiException extends Exception 2 { 3 CeshiException() 4 {} 5 6 7 CeshiException(String msg) 8 { 9 super(msg);10 }11 }四、異常處理原則1.函數內容如果拋出需要檢測的異常,那么函數上必須要聲明,否則必須在函數內用try...catch捕捉,否則編譯失敗。
2.如果調用到了聲明異常的函數,要么try...catch要么throws,否則編譯失敗。
3.一個功能如果拋出了多個異常,那么調用時,必須有對應多個catch進行針對性的處理。內部有幾個需要檢測的異常,就拋幾個異常,拋出幾個,就catch幾個。
五、異常處理機制在 Java 應用程序中,異常處理機制為:拋出異常,捕捉異常。1、拋出異常:當一個方法出現錯誤引發異常時,方法創建異常對象并交付運行時系統,異常對象中包含了異常類型和異常出現時的程序狀態等異常信息。運行時系統負責尋找處置異常的代碼并執行。
2、捕獲異常:在方法拋出異常之后,運行時系統將轉為尋找合適的異常處理器(exception handler)。潛在的異常處理器是異常發生時依次存留在調用棧中的方法的集合。當異常處理器所能處理的異常類型與方法拋出的異常類型相符時,即為合適 的異常處理器。運行時系統從發生異常的方法開始,依次回查調用棧中的方法,直至找到含有合適異常處理器的方法并執行。當運行時系統遍歷調用棧而未找到合適 的異常處理器,則運行時系統終止。同時,意味著Java程序的終止。
六、最后一個程序的異常處理框架的好壞直接影響到整個項目的代碼質量以及后期維護成本和難度。用好異常處理才能讓我們的程序跟健壯。
新聞熱點
疑難解答