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

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