分類
<p>異常對象對派生于Throwable類的一個實例。如果java中內(nèi)置的異常類不能夠滿足需求,用戶可以創(chuàng)建自己的異常類</p>
簡單的類關(guān)系圖
主要類介紹
Error
Error類層次結(jié)構(gòu)描述了Java 運行時系統(tǒng)內(nèi)部的錯誤和資源耗盡錯誤。應(yīng)用程序不應(yīng)該拋出這種類型的對象。如果出現(xiàn)這樣的內(nèi)部錯誤,除了通告給用戶,并盡力使程序安全的終止之外,再也無能為力。(即這種情況,不需要用戶處理,是系統(tǒng)處理的)
Exceptions
這個層次結(jié)構(gòu)有分解為兩個分支:一個分支派生于RuntimeExcepton,另一個分支包含其他異常。劃分兩個分支的規(guī)則是:由程序錯誤導(dǎo)致的異常屬于RunTimeException;而程序本身沒問題,但由于像I/O錯誤這類問題導(dǎo)致的異常屬于其他異常。
舉例
RuntimeException
- 錯誤的類型轉(zhuǎn)換
- 數(shù)組越界訪問
- 訪問空指針
不是派生于RunTimeException 的異常包括
- 試圖在文件尾部后面讀取數(shù)據(jù)
- 試圖查找一個不村子的文件
- 通過給定字符串查找Class對象,但是這個類并不存在
Java語言規(guī)范將派生于Error類或RuntimeExceptoin類的所有異常稱為(Unchecked)未檢查異常。編譯器將核查是否為所有的已檢查異常提供了異常處理
聲明已檢查異常
如果遇到了無法處理的情況,那么Java的方法可以拋出一個異常。(一個方法不僅需要告訴編譯器要返回什么值,還要告訴編譯器有可能發(fā)生什么錯誤)
方法應(yīng)該在其首部聲明所有可能拋出的異常。這樣可以從首部反映出這個方法可能拋出那類已檢查異常
例如
public void myExceptionMethod() throws Exception {}
當(dāng)然不必將所有可能拋出的異常進行聲明,至于什么時候需要在方法中用throws語句聲明異常,什么時候必須用throws語句聲明,記住下面四種情況
- 調(diào)用一個拋出已檢查異常的方法
- 程序運行過程中發(fā)現(xiàn)錯誤,并且利用throw語句拋出一個已檢查異常
- 程序出現(xiàn)錯誤
- Java虛擬機和運行時庫出現(xiàn)的內(nèi)部錯誤
一個方法必須聲明所有可能拋出的已檢查異常,而未檢查異常要么不可控制(Erro),要么就應(yīng)該避免發(fā)生(RuntimeExceptoin).如果方法沒有聲明所有可發(fā)生的已檢查異常,編譯器就會報錯
創(chuàng)建異常程序類
在程序中,可能會遇到任何標(biāo)準(zhǔn)異常類都沒有能夠充分描述清楚的問題。在這種情況下,就需要創(chuàng)建自己的異常類。即定義一個派生于Exception(或其子類)的類,定義的類應(yīng)該包含兩個構(gòu)造方法,一個默認(rèn),一個是帶有詳細(xì)信息的。
*例
class myExceptoinClass extends IOException {
public myExceptoinClass() { }
public myExceptoinClass(String gripe) {
super(guride);
}
}
捕獲異常
如果異常發(fā)生時候沒有任何地方進行捕獲,程序就會終止執(zhí)行,并在控制臺上打印輸出異常信息。
捕獲異常必須設(shè)置try/catch語句塊。
捕獲多個異常 try/catch/catch
再次拋出異常與異常鏈
finally子句
try/catch/finally,無論try語句塊中是否遇到異常,finally子句都會被執(zhí)行。
警告:當(dāng)finally中包含return語句時。假設(shè)利用return語句從try語句塊中退出。會在方法返回前,finally語句內(nèi)容會被執(zhí)行,若finally中也有return語句,則這個返回值會覆蓋原始返回值。
帶資源的try語句
會自動調(diào)用 close(),并且close()的異常會被壓制。
分析堆棧跟蹤元素
堆棧跟蹤(strack trace) 是一個方法調(diào)用過程列表,他們包含了程序執(zhí)行過程中方法調(diào)用的特定位置。當(dāng)Java程序正常終止,而沒有捕獲異常時,這個列表就會顯示出來。
小結(jié)
后面例子少了好多,時間有些不足沒寫出來,感興趣的話可以看下“Java核心技術(shù)卷一 4th”。
簡單總結(jié)下,如果分為兩類的話是,已檢查異常和未檢查異常,而已檢查異常必須做處理,否則編譯器會報錯。
內(nèi)容差很多,有時間補上。
內(nèi)容參考:Java核心技術(shù)卷一 4th