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í)才做異常處理,這樣的做法是很值得借鑒的。