異常概述
異常是運(yùn)行是在代碼序列中引起的非正常情況.換句話說(shuō),異常是運(yùn)行時(shí)錯(cuò)誤.
Java異常是用來(lái)描述在一段代碼中發(fā)生的異常情況(也就是錯(cuò)誤)的對(duì)象.當(dāng)出現(xiàn)引起異常的情況時(shí),就會(huì)創(chuàng)建用來(lái)表示異常的對(duì)象,并在引起錯(cuò)誤的方法中拋出異常對(duì)象.
方法可以選擇自己處理異常,也可以繼續(xù)傳遞異常.
異常類型
所有異常類型都是內(nèi)置類Throwable的子類.Throwable位于異常類層次中的頂部.緊隨Throwable之下的兩個(gè)子類,它們將異常分為兩個(gè)不同的分支.
一個(gè)分支是Exception類,這個(gè)類既可以用于用戶程序應(yīng)當(dāng)捕獲的異常情況,也可以用于創(chuàng)建自定義異常類型的子類.Exception有一個(gè)重要的子類,名為RuntimeException.
另一個(gè)分支是Error類,該類定義了在常規(guī)環(huán)境下不希望有程序捕獲的異常.Error類型的異常有Java運(yùn)行時(shí)系統(tǒng)使用,指運(yùn)行環(huán)境本身出現(xiàn)了某些錯(cuò)誤.
未捕獲的異常
int d = 0;
int a = 42 / d;
上述語(yǔ)句執(zhí)行時(shí),系統(tǒng)檢測(cè)到試圖除以零時(shí),它會(huì)構(gòu)造一個(gè)新的異常對(duì)象,然后拋出異常java.lang.ArithmeticException: / by zero
如果沒(méi)有即時(shí)捕獲處理,程序會(huì)立即終止運(yùn)行.
捕獲異常
使用try和catch來(lái)捕獲異常.
try {
int d = 0;
int a = 42 / d;
} catch (Exception e){
System.out.println("程序出現(xiàn)了異常");
}
這個(gè)時(shí)候你就會(huì)發(fā)現(xiàn),程序并沒(méi)有終止運(yùn)行,而是執(zhí)行了catch代碼中的代碼.
自己處理異常有兩個(gè)優(yōu)點(diǎn):
1.允許修復(fù)錯(cuò)誤.
2.阻止程序自動(dòng)終止.
多條catch字句
try {
int d = 0;
int a = 42 / d;
} catch (Exception e){
System.out.println("Exception");
} catch (ArithmeticException ae){
System.out.println("ArithmeticException");
}
上面我只是舉了一個(gè)例子,如果程序先捕獲了第一個(gè)catch的異常,那么程序不回再去捕獲第二個(gè)catch的異常,以此類推.
我這是在舉例子,因?yàn)镋xception是所有異常的父類所以絕對(duì)不可能后捕獲ArithmeticException異常的.
手動(dòng)拋出異常
使用throw關(guān)鍵字.
try {
throw new ArithmeticException();
} catch (ArithmeticException ae){
System.out.println("ArithmeticException");
}
上述代碼中我們手動(dòng)拋出了ArithmeticException異常,而Java中所有異常都是對(duì)象.所以我們要?jiǎng)?chuàng)建ArithmeticException對(duì)象并拋出.
引發(fā)異常但不處理
使用throws關(guān)鍵字
public void testMethod() throws ArithmeticException {
}
上述代碼我們的這個(gè)方法執(zhí)行的時(shí)候發(fā)生了異常,但是我們不做處理,并且將異常向上拋(拋給調(diào)用此方法的方法).
如果我們的方法中使用了自定義異常類,那么我們也需要向上拋出.
自定義異常類
class TestExcption extends Exception{
public TestExcption(){}
public TestExcption(String info){
super(info);
}
}
throw和throws的區(qū)別
1.throws使用在函數(shù)上.
???throw使用在函數(shù)內(nèi).
2.throws拋出的是異常類,可以拋出多個(gè),用逗號(hào)隔開.
???throw拋出的是異常對(duì)象.
finally
使用finally可以創(chuàng)建一個(gè)代碼塊,改代碼塊會(huì)在執(zhí)行try/catch代碼塊之后,并在執(zhí)行try/catch代碼塊后面的代碼之前執(zhí)行.也就是說(shuō) 不管是否有異常拋出,都會(huì)執(zhí)行finally代碼塊.
try{
} catch (Exception e) {
} finally {
}