
在Java中,所有的例外都有一個共同的祖先java.lang包中的Throwable類,Throwable:有 兩個重要的子類: Exception (例外)和Error (錯誤),二者都是Java例外處理的重要子類,各自都包含大量子類,
一、Error ( 錯誤) :是程式無法處理的錯誤
表示運行應用程式中較嚴重問題,大多數錯誤與代碼撰寫者執行的操作無關,而表示代碼運行時JVM(Java虛擬機)出現的問題,例如,Java 虛擬機運行錯誤(Virtual MachineError),當JVM不再有繼續執行操作所需的記憶體資源時,將出現OutOfMemoryError, 這些例外發生時,Java 虛擬機(JVM)一般會選擇執行緒終止,這些錯誤表示故障發生于虛擬機自身、或者發生在虛擬機試圖執行應用時,如Java虛擬機運行錯誤(Virtual MachineError)、類定義錯誤(NoClassDefFoundError)等,這些錯誤是不可查的,因為它們在應用程式的控制和處理能力之外,而且絕大多數是程式運行時不允許出現的狀況,對于設計合理的應用程式來說,即使確實發生了錯誤,本質上也不應該試圖去處理它所引起的例外狀況,在Java 中,錯誤通過Error的子類描述,
二、Exception (例外) :是程式本身可以處理的例外,
Exception 類有一個重要的子類RuntimeException,RuntimeException 例外由Java虛擬機拋出,NullPointerException (要訪問的變數沒有參考任何物件時,拋出該例外)、ArithmeticException (算術運算例外,一個整數除以0時,拋出該例外)和ArrayIndexOutOfBoundsException ( 下標越界例外),
總體上我們根據 Javac 對例外的處理要求,將例外類分為二類: 非檢查例外( unckecked exception ): RuntimeException 以及他的子類, javac 在編譯時,不會提示和發現這樣的例外,不要求在程式處理這些例外,所以如果愿意,我們可以撰寫代碼處理(使用 try…catch…finally )這樣的例外,也可以不處理,對于這些例外,我們應該修正代碼,而不是去通過例外處理器處理 ,這樣的例外發生的原因多半是代碼寫的有問題,如除0錯誤 ArithmeticException ,強制型別轉換錯誤 ClassCastException ,陣列索引越界 ArrayIndexOutOfBoundsException ,使用了空物件NullPointerException 等等, 檢查例外( checked exception ):除了 Error 和 RuntimeException 的其它例外, javac 強制要求程式員為這樣的例外做預備處理作業(使用 try…catch…finally 或者 throws ),在方法中要么用 try-catch 陳述句捕獲它并處理,要么用throws子句宣告拋出它,否則編譯不會通過,這樣的例外一般是由程式的運行環境導致的,因為程式可能被運行在各種未知的環境下,而程式員無法干預用戶如何使用他撰寫的程式,于是程式員就應該為這樣的例外時刻準備著,如 SQLException , IOException , ClassNotFoundException 等, 需要明確的是:檢查和非檢查是對于 javac 來說的,這樣就很好理解和區分了,
注意:例外和錯誤的區別:例外能被程式本身可以處理,錯誤是無法處理,
當方法中生了例外可以選擇拋出(throw),也可以選擇try-catch-finally捕獲處理
三、Throwable類常用方法
●public string getMessage): 回傳例外發生時的詳細資訊
●public string toString: 返 回例外發生時的簡要描述
●public string getLocalizedMessage: 返 回例外物件的本地化資訊, 使用Throwable的子類覆寫這個方法,可以聲稱本地化資訊,如果子類沒有覆寫該方法,則該方法回傳的資訊與getMessage ()回傳的結果相同
●public void printStackTrace(): 在控制臺上列印Throwable物件封裝的例外資訊
四、Throw 和 throws 的區別
4.1 位置不同
throws 用在函式上,后面跟的是例外類,可以跟多個;而 throw 用在函式內,后面跟的是例外物件,
4.2 功能不同
● throws 用來宣告例外,讓呼叫者只知道該功能可能出現的問題,可以給出預先的處理方式;throw 拋出具體的問題物件,執行到 throw,功能就已經結束了,跳轉到呼叫者,并將具體的問題物件拋給呼叫者,也就是說 throw 陳述句獨立存在時,下面不要定義其他陳述句,因為執行不到,
● throws 表示出現例外的一種可能性,并不一定會發生這些例外;throw 則是拋出了例外,執行 throw 則一定拋出了某種例外物件,
● 兩者都是消極處理例外的方式,只是拋出或者可能拋出例外,但是不會由函式去處理例外,真正的處理例外由函式的上層呼叫處理,
五、例外處理總結
● try 塊: 用于捕獲例外,其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally 塊,
● catch塊: 用于處理try捕獲到的例外,
● finally塊: 無論是否捕獲或處理例外,finally塊里的陳述句都會被執行,當在try塊或catch塊中遇到return陳述句時,finally 陳述句塊將在方法回傳之前被執行,
在以下4種特殊情況下,finally 塊不會被執行:
1.在finally陳述句塊中發生了例外,
2.在前面的代碼中用了System.exit()退出程式,
3.程式所在的執行緒死亡,
4.關閉CPU,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/151069.html
標籤:Java
上一篇:序列化
下一篇:獲取鍵盤輸入常用的兩種方法
