1.初始Exception
最開始接觸java異常應(yīng)該是從java的關(guān)鍵字try和catch開始,try語句中是嘗試執(zhí)行的代碼,catch對(duì)try語句中出現(xiàn)的異常進(jìn)行捕捉處理,如下所示:
public boolean mothed(){
try{
//
return true;
}catch(AException e)
{
//
return false;
}
//
}
這里注意兩點(diǎn):一是try語句中拋出的異常必須是AEception的實(shí)例或者AException子類的實(shí)例,否則不能捕獲,即catch塊的代碼不會(huì)執(zhí)行;二是try和catch塊中都可以主動(dòng)拋出異常,或者通過return停止method方法的執(zhí)行。拋出Exception的例子如下:
public boolean mothed() throws AException {
try {
//
return true;
} catch (Exception e) {
//
throw new AException(e.getMessage());
}
//
}
catch里面主動(dòng)拋出異常就是此處不解決此異常,交給它的調(diào)用函數(shù)自己處理,一般不在try里面主動(dòng)拋異常。
更復(fù)雜的就是try,catch,finally的語句,如下所示:
public boolean mothed() {
try {
//
return true;
} catch (Exception e) {
//
return false;
}finally{
//
}
//
}
和try,catch語句相比,這里多了finally關(guān)鍵字,表示必須執(zhí)行的語句塊,也就是說不管try是否執(zhí)行成功,catch是否捕捉到了try拋出的異常,finally里面的語句都會(huì)被得到執(zhí)行,通常用來釋放資源。這個(gè)地方就牽涉到一個(gè)問題了,執(zhí)行finally以后,代碼怎么執(zhí)行?是執(zhí)行finally語句塊后面的語句還是跑回去執(zhí)行catch或者try里面的語句呢?答案是都有可能。如果try正確執(zhí)行,運(yùn)行到了return true的地方,程序不會(huì)馬上返回,而是乖乖執(zhí)行finally里面的語句,執(zhí)行完成以后(如果里面沒有拋出異常或者return之類的),就會(huì)回到return true的地方,從而結(jié)束method方法;如果是try里面出現(xiàn)了異常,被catch捕獲,然后運(yùn)行到return false處,同樣也不會(huì)立即返回,也是執(zhí)行finally里面的內(nèi)容,然后回到return false處結(jié)束調(diào)用。如果try,catch里面都沒有返回或者拋出異常,那么就只有執(zhí)行finally塊后面的代碼了。
2.異常的分類
下面分析一下java異常的類圖:

Thorwable類所有異常和錯(cuò)誤的超類,有兩個(gè)子類Error和Exception,分別表示錯(cuò)誤和異常。其中異常類Exception又分為運(yùn)行時(shí)異常(RuntimeException)和非運(yùn)行時(shí)異常,又分別稱之為不檢查異常(Unchecked
Exception)和檢查異常(Checked Exception)。下面將詳細(xì)講述這些異常之間的區(qū)別與聯(lián)系:
Error與Exception 中國網(wǎng)管聯(lián)盟bitsCN.com
Error是程序無法處理的錯(cuò)誤,比如OutOfMemoryError、ThreadDeath等。這些異常發(fā)生時(shí),Java虛擬機(jī)(JVM)一般會(huì)選擇線程終止。
Exception是程序本身可以處理的異常,這種異常分兩大類運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常。程序中應(yīng)當(dāng)盡可能去處理這些異常。 網(wǎng)管聯(lián)盟bitsCN@com
行時(shí)異常和非運(yùn)行時(shí)異常
運(yùn)行時(shí)異常都是RuntimeException類及其子類異常,如NullPointerException、
IndexOutOfBoundsException等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯(cuò)誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。
非運(yùn)行時(shí)異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類,是Checked Exception。從程序語法角度講是必須進(jìn)行處
理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常。
3.異常的處理原則
1、 能處理就早處理,拋出不去還不能處理的就想法消化掉或者轉(zhuǎn)換為RuntimeException處理。因?yàn)閷?duì)于一個(gè)應(yīng)用系統(tǒng)來說,拋出大量異常是有問題的,應(yīng)該從程序開發(fā)角度盡可能的控制異常發(fā)生的可能。
2、 對(duì)于檢查異常,如果不能行之有效的處理,還不如轉(zhuǎn)換為RuntimeException拋出。這樣也讓上層的代碼有選擇的余地,可處理也可不處理。
3、 對(duì)于一個(gè)應(yīng)用系統(tǒng)來說,應(yīng)該有自己的一套異常處理框架,這樣當(dāng)異常發(fā)生時(shí),也能得到統(tǒng)一的處理風(fēng)格,將優(yōu)雅的異常信息反饋給用戶。Spring就是將所有的異常轉(zhuǎn)化為RuntimeException基類,然后所有具體的異常都集成此基類。引入Spring會(huì)是代碼很優(yōu)美,不是到處充斥著異常的處理,讓用戶更多的關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn),必要時(shí)才做異常處理,這樣的做法是很值得借鑒的。