一、概述
Java異常是Java提供的一種識(shí)別和響應(yīng)錯(cuò)誤的一致性機(jī)制。
Java異常機(jī)制可以使得異常處理代碼和正常業(yè)務(wù)邏輯代碼分離媚赖,使程序更加優(yōu)雅,提高代碼的健壯性珠插。一般情況下惧磺,Java異常應(yīng)用可以回答三個(gè)問題:what、where捻撑、why磨隘。what:發(fā)生了什么錯(cuò)誤?where:哪里發(fā)生的顾患?why:為什么會(huì)發(fā)生番捂?分別由異常中異常類型、異常堆棧江解、異常信息回答设预。
二、框架
Throwable
Throwable是Java語言中所有錯(cuò)誤或異常的超類犁河。
Throwable包含兩個(gè)子類:Error和Exception鳖枕。Error表示“錯(cuò)誤”,Exception表示“異澈艄桑”
Throwable中包含異常堆棧和異常信息耕魄。可以使用printStackTrace()
和getMessage()
獲取彭谁。
Error
Throwable子類吸奴,用于指示應(yīng)用程序不該捕獲且無法解決的嚴(yán)重問題。
編譯器并不會(huì)檢查Error缠局。
Exception
Throwable子類则奥,用于指示應(yīng)用程序發(fā)生的異常。
RuntimeException
Exception子類狭园,用于指示Java 虛擬機(jī)正常運(yùn)行期間拋出的異常读处。
編譯器不會(huì)檢查RuntimeException。
如果產(chǎn)生了RuntimeException唱矛,需要修改代碼來進(jìn)行避免罚舱。例如井辜,若會(huì)發(fā)生除數(shù)為零的情況,則需要通過代碼避免該情況的發(fā)生管闷。
三粥脚、異常分類
java中異常可以分為三類:被檢查的異常(Checked Exception)包个、運(yùn)行時(shí)異常(Runtime Exception)和錯(cuò)誤(Error)刷允。
1.被檢查異常
范圍:Exception類及其子類(不包含RuntimeException及其子類)
特點(diǎn):編譯器會(huì)檢查它。此類異常碧囊,要么通過throws進(jìn)行聲明拋出树灶,要么通過try-catch進(jìn)行捕獲處理,否則不能通過編譯糯而。
處理:拋出或者捕獲異常天通,并嘗試恢復(fù)。
常見:
異常 | 說明 |
---|---|
CloneNotSupportedException | 通過clone()接口去克隆一個(gè)對(duì)象熄驼,而該對(duì)象對(duì)應(yīng)的類沒有實(shí)現(xiàn)Cloneable接口 |
2. 運(yùn)行時(shí)異常
范圍:RuntimeException及其子類
特點(diǎn):編譯器不會(huì)檢查運(yùn)行時(shí)異常土砂。即“沒有通過throws聲明拋出它”或者“沒有在try-catch中捕獲它”,都是可以通過編譯的谜洽。
處理:當(dāng)產(chǎn)生運(yùn)行時(shí)異常時(shí)萝映,需要檢查代碼,完善代碼邏輯來避免阐虚。
常見:
異常 | 說明 |
---|---|
ArithmeticException | 除數(shù)為0 |
IndexOutOfBoundsException | 數(shù)組越界 |
ConcurrentModificationException | 并發(fā)修改 |
3.錯(cuò)誤
范圍:Error及其子類序臂。
特點(diǎn):編譯器不會(huì)檢查它。
處理:程序本身無法修復(fù)這些錯(cuò)誤的实束。
常見:
異常 | 說明 |
---|---|
VirtualMachineError | 虛擬機(jī)錯(cuò)誤 |
4.使用
對(duì)于可以恢復(fù)的條件使用被檢查異常奥秆,對(duì)于程序錯(cuò)誤使用運(yùn)行時(shí)異常。
四咸灿、使用建議
1. 合理使用被檢查異常
使用被檢查的異常必須同時(shí)滿足兩個(gè)條件:
- 正確調(diào)用API并不能阻止異常的發(fā)生构订。
- 一旦發(fā)生了異常,調(diào)用者可以采取有用的動(dòng)作對(duì)程序進(jìn)行處理
2. 合理包裝低層異常
盡量避免一個(gè)方法拋出一個(gè)與它執(zhí)行的任務(wù)沒有明顯的關(guān)聯(lián)關(guān)系的異常避矢。常見于方法傳遞由低層抽象拋出的異常悼瘾,這種情況發(fā)生時(shí),不僅讓人困惑审胸,而且也"污染"了高層API亥宿。
為了避免這個(gè)問題,高層實(shí)現(xiàn)應(yīng)該捕獲低層的異常砂沛,同時(shí)拋出一個(gè)可以按照高層抽象進(jìn)行介紹的異常烫扼。這種做法被稱為"異常轉(zhuǎn)譯(exception translation)"。
例如碍庵,在Java的集合框架AbstractSequentialList的get()方法如下:
public E get(int index) {
try {
return listIterator(index).next();
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}