Throwable類
Throwable類是整個異常體系類的父級類,它實(shí)現(xiàn)了Serializable接口,它的父類是Object類金麸,它的子類有Exception和Error,這2個子類下面都有很多子類簿盅。
Error是程序發(fā)生了重大錯誤挥下,不能解決,只能避免桨醋,比如:內(nèi)存泄漏
Exception:可對其進(jìn)行處理的異常
受檢異常和非受檢異常
受檢異常(checkedException):程序必須處理該異常棚瘟。除了RuntimeExcetion及其子類(運(yùn)行時異常),其他的Exception及其子類都屬于受檢異常喜最,這種異常的特點(diǎn)是java編譯器會檢查它偎蘸,當(dāng)程序中可能出現(xiàn)這類異常,要么用try-catch語句捕獲它瞬内,要么用throws子句聲明拋出它迷雪,否則編譯不會通過。
非受檢異常(uncheckedException):編譯器不要求強(qiáng)制處置的異常虫蝶。包括運(yùn)行時異常(RuntimeException與其子類)和錯誤(Error)章咧。
運(yùn)行時與非運(yùn)行時異常
Exception 這種異常分兩大類運(yùn)行時異常和非運(yùn)行時異常(編譯異常)。程序中應(yīng)當(dāng)盡可能去處理這些異常能真。
運(yùn)行時異常:都是RuntimeException類及其子類異常赁严,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標(biāo)越界異常)等粉铐,這些異常是非受檢異常疼约,程序中可以選擇捕獲處理,也可以不處理秦躯。這些異常一般是由程序邏輯錯誤引起的忆谓,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。
運(yùn)行時異常的特點(diǎn)是Java編譯器不會檢查它踱承,也就是說,當(dāng)程序中可能出現(xiàn)這類異常茎活,即使沒有用try-catch語句捕獲它昙沦,也沒有用throws子句聲明拋出它,也會編譯通過载荔。
非運(yùn)行時異常 (編譯異常):是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過舆驶。如IOException而钞、SQLException等以及用戶自定義的Exception異常沙廉,不過一般情況下不自定義檢查異常撬陵。
異常處理
程序運(yùn)行過程中可能會出現(xiàn)異常情況,比如被0除官疲、對負(fù)數(shù)計算平方根等袱结,還有可能會出現(xiàn)致命的錯誤,比如內(nèi)存不足途凫,磁盤損壞無法讀取文件等垢夹,對于異常和錯誤情況的處理,統(tǒng)稱為異常處理维费。
Java異常處理主要通過5個關(guān)鍵字控制:try果元、catch、throw犀盟、throws和finally而晒。try的意思是試試它所包含的代碼段中是否會發(fā)生異常;而catch當(dāng)有異常時抓住它阅畴,并進(jìn)行相應(yīng)的處理倡怎,使程序不受異常的影響而繼續(xù)執(zhí)行下去;throw是在程序中明確引發(fā)異常贱枣;throws的作用是如果一個方法可以引發(fā)異常监署,而它本身并不對該異常處理,那么它必須將這個異常拋給調(diào)用它的方法纽哥;finally是無論發(fā)不發(fā)生異常都要被執(zhí)行的代碼钠乏。
關(guān)鍵字:throw,throws,try和catch的用法如下:
throws出現(xiàn)在方法的聲明中,表示該方法可能會拋出的異常春塌,允許throws后面跟著多個異常類型
throw出現(xiàn)在方法體中晓避,用于拋出異常簇捍。當(dāng)方法在執(zhí)行過程中遇到異常情況時,將異常信息封裝為異常對象俏拱,然后throw暑塑。
try出現(xiàn)在方法體中,它自身是一個代碼塊锅必,表示嘗試執(zhí)行代碼塊的語句梯投。如果在執(zhí)行過程中有某條語句拋出異常,那么代碼塊后面的語句將不被執(zhí)行况毅。一個try后面可以跟多個catch,但不管多少個尔艇,最多只會有一個catch塊被執(zhí)行尔许。
catch出現(xiàn)在try代碼塊的后面,自身也是一個代碼塊终娃,用于捕獲異常try代碼塊中可能拋出的異常味廊。catch關(guān)鍵字后面緊接著它能捕獲的異常類型,所有異常類型的子類異常也能被捕獲棠耕。
常見的異常:
NullPointerException 空指針異常
ArrayIndexOutOfBoundsException 數(shù)組下標(biāo)越界異常
StringIndexOutOfBoundsException 字符串下標(biāo)越界異常
ClassCastException 類型轉(zhuǎn)換異常
NumberFormatException 數(shù)字轉(zhuǎn)換異常
代碼示例
下面來看看代碼余佛,從代碼中深刻理解Exception
例1:
Scanner scanner = new Scanner(System.in);
// 下面可以引發(fā)InputMismatchException,為非受檢異常
int i = scanner.nextInt();//這里定義為int,如果鍵盤輸入為string類型則會出現(xiàn)異常
System.out.println(i);
// 下面這個是受檢異常窍荧,必須處理辉巡,否則編譯不通過
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
例2:
int i;
Scanner scanner = new Scanner(System.in);
try {// 放可能發(fā)生異常的代碼塊
i = scanner.nextInt();
} catch (InputMismatchException e) {
System.out.println("捕獲到了InputMismatchException");
} catch (Exception e) {// 捕獲異常,對異常的處理
System.out.println("發(fā)生了異常");
e.printStackTrace();
} finally {// 始終要執(zhí)行的代碼
System.out.println("無論有沒有發(fā)生異常我是一定會執(zhí)行的");
}
System.out.println("----程序結(jié)束");
將上面的代碼運(yùn)行2次輸出結(jié)果分別是:
第一次輸入123結(jié)果
123
無論有沒有發(fā)生異常我是一定會執(zhí)行的
----程序結(jié)束
第二次輸入asdf結(jié)果
asdf
捕獲到了InputMismatchException
無論有沒有發(fā)生異常我是一定會執(zhí)行的
----程序結(jié)束
由這2次結(jié)果可以看出蕊退,finally不能是否發(fā)生異常都執(zhí)行了郊楣;try后面可以跟著多個catch,但是最多只能執(zhí)行一個catch瓤荔【辉椋可以在try后面加任意數(shù)量的catch塊,如果try中的代碼發(fā)生異常输硝,異常被拋給第一個catch快今瀑,如果拋出異常的數(shù)據(jù)類型與第一個catch類型匹配,它就在這里被捕獲点把,如果不匹配橘荠,它會傳入第二個catch塊,以此類推知道最后一個catch塊愉粤。
例3:
public static void main(String[] args) {
int a = 10, b = -4;
int result;
try {
result = div(a, b);
System.out.println("result=" + result);
} catch (Exception e) {
System.out.println("捕獲到了異常");
System.out.println(e.getMessage());
}
System.out.println("---程序結(jié)束");
}
// 在方法后面用throws關(guān)鍵字 把異常拋出去砾医,誰調(diào)用誰處理
public static int div(int a, int b) throws Exception {
if (b < 0) {
// 使用throw拋出一個異常
throw new Exception("被除數(shù)不能小于0");
}
if (b == 0) {
// 使用throw拋出一個異常
throw new Exception("被除數(shù)不能為0");
}
return a / b;
}
輸出為:
捕獲到了異常
被除數(shù)不能小于0
---程序結(jié)束
這個例子是自定義什么條件下拋出異常,我們定義了被除數(shù)為0或者被除數(shù)小于0時拋出異常衣厘,并通過throws把異常拋出如蚜,誰調(diào)用這個方法压恒,誰就處理這個異常或者繼續(xù)拋出错邦。
擴(kuò)展:錯誤和異常的區(qū)別(Error vs Exception)
1)java.lang.Error:Throwable的子類探赫,用于標(biāo)記嚴(yán)重錯誤。合理的應(yīng)用程序不應(yīng)該去try/catch這種錯誤撬呢。絕大多數(shù)的錯誤都是非正常的伦吠,就根本不該出現(xiàn)的。
2)java.lang.Exception: Throwable的子類魂拦,用于指示一種合理的程序想去catch的條件毛仪。即它僅僅是一種程序運(yùn)行條件,而非嚴(yán)重錯誤芯勘,并且鼓勵用戶程序去catch它箱靴。
擴(kuò)展:錯誤和異常的區(qū)別(Error vs Exception)
1)java.lang.Error: Throwable的子類,用于標(biāo)記嚴(yán)重錯誤荷愕。合理的應(yīng)用程序不應(yīng)該去try/catch這種錯誤衡怀。絕大多數(shù)的錯誤都是非正常的,就根本不該出現(xiàn)的安疗。
2)java.lang.Exception: Throwable的子類抛杨,用于指示一種合理的程序想去catch的條件。即它僅僅是一種程序運(yùn)行條件荐类,而非嚴(yán)重錯誤怖现,并且鼓勵用戶程序去catch它。
聲明自定義異常
在java中可以自定義異常掉冶,編寫自己自定義的異常時需要注意:
- 所有異常都必須是Throwable的子類
- 如果希望寫一個受檢異常類真竖,則需要繼承Exception類
- 如果希望寫一個運(yùn)行時異常類,那么需要繼承RuntimeException類
請尊重作者勞動成果厌小,轉(zhuǎn)載請標(biāo)明原文鏈接:http://www.reibang.com/p/aaf0103604d8