官术网_书友最值得收藏!

2.2 異常分類及處理

我們在開發(fā)過程中難免會遇到各種各樣的異常,如何處理異常直接影響到程序或系統(tǒng)的穩(wěn)定性,有時在線上僅僅忘記處理一個空指針異常都有可能引起整個運(yùn)行中的應(yīng)用程序的崩潰,因此具備全面的異常處理處理知識和良好的異常處理習(xí)慣對于開發(fā)人員來說至關(guān)重要。

2.2.1 異常的概念

異常指在方法不能按照正常方式完成時,可以通過拋出異常的方式退出該方法,在異常中封裝了方法執(zhí)行過程中的錯誤信息及原因,調(diào)用方在獲取該異常后可根據(jù)業(yè)務(wù)的情況選擇處理該異常或者繼續(xù)拋出該異常。

在方法在執(zhí)行過程中出現(xiàn)異常時,Java異常處理機(jī)制會將代碼的執(zhí)行權(quán)交給異常處理器,異常處理器根據(jù)在系統(tǒng)中定義的異常處理規(guī)則執(zhí)行不同的異常處理邏輯(拋出異常或捕捉并處理異常)。

2.2.2 異常分類

在Java中,Throwable是所有錯誤或異常的父類,Throwable又可分為Error和Exception,常見的Error有AWTError、ThreadDeath, Exception又可分為RuntimeException和CheckedException,如圖2-6所示。

圖2-6

Error指Java程序運(yùn)行錯誤,如果程序在啟動時出現(xiàn)Error,則啟動失敗;如果程序在運(yùn)行過程中出現(xiàn)Error,則系統(tǒng)將退出進(jìn)程。出現(xiàn)Error通常是因為系統(tǒng)的內(nèi)部錯誤或資源耗盡,Error不能被在運(yùn)行過程中被動態(tài)處理。如果程序出現(xiàn)Error,則系統(tǒng)能做的工作也只能有記錄錯誤的成因和安全終止。

Exception指Java程序運(yùn)行異常,即運(yùn)行中的程序發(fā)生了人們不期望發(fā)生的事件,可以被Java異常處理機(jī)制處理。Exception也是程序開發(fā)中異常處理的核心,可分為RuntimeException(運(yùn)行時異常)和CheckedException(檢查異常),如圖2-7所示。

圖2-7

◎ RuntimeException:指在Java虛擬機(jī)正常運(yùn)行期間拋出的異常,RuntimeException可以被捕獲并處理,如果出現(xiàn)RuntimeException,那么一定是程序發(fā)生錯誤導(dǎo)致的。我們通常需要拋出該異常或者捕獲并處理該異常。常見的RuntimeException有NullPointerException、ClassCastException、ArrayIndexOutOf BundsException等。

◎ CheckedException:指在編譯階段Java編譯器會檢查CheckedException異常并強(qiáng)制程序捕獲和處理此類異常,即要求程序在可能出現(xiàn)異常的地方通過try catch語句塊捕獲并處理異常。常見的CheckedException有由于I/O錯誤導(dǎo)致的IOException、SQLException、ClassNotFoundException等。該類異常一般由于打開錯誤的文件、SQL語法錯誤、類不存在等引起。

2.2.3 異常處理方式:拋出異常、使用try catch捕獲并處理異常

異常處理方式有拋出異常和使用try catch語句塊捕獲并處理異常這兩種方式。

(1)拋出異常:遇到異常時不進(jìn)行具體處理,而是將異常拋給調(diào)用者,由調(diào)用者根據(jù)情況處理。有可能是直接捕獲并處理,也有可能是繼續(xù)向上層拋出異常。拋出異常有三種形式:throws、throw、系統(tǒng)自動拋出異常。其中,throws作用在方法上,用于定義方法可能拋出的異常;throw作用在方法內(nèi),表示明確拋出一個異常。具體的使用方法如下:

public  static  void  main(String[]  args)  {
      String  str  =  "hello  offer";
      int  index  =  10;
      if  (index  >=  str.length())
      {
          //1:使用throw在方法內(nèi)拋出異常
          throw  new  StringIndexOutOfBoundsException();
      }else  {
          str.substring(0, index);
      }
}
//2:使用throws在方法上拋出異常
int  div(int  a, int  b)  throws  Exception{return  a/b; }

以上代碼首先驗證字符串的長度,如果長度不夠,則通過throw關(guān)鍵字在方法內(nèi)拋出一個StringIndexOutOfBoundsException異常,同時定義了一個div方法,使用throws關(guān)鍵字在該方法上定義一個異常。

(2)使用try catch捕獲并處理異常:使用try catch捕獲異常能夠有針對性地處理每種可能出現(xiàn)的異常,并在捕獲到異常后根據(jù)不同的情況做不同的處理。其使用過程比較簡單:用try catch語句塊將可能出現(xiàn)異常的代碼包起來即可。具體的使用方法如下:

try  {
    //具體的業(yè)務(wù)邏輯實(shí)現(xiàn)
  }catch  (Exception  e){
  //捕獲異常并處理
}

throw和throws的區(qū)別如下。

◎ 位置不同:throws作用在方法上,后面跟著的是異常的類;而throw作用在方法內(nèi),后面跟著的是異常的對象。

◎ 功能不同:throws用來聲明方法在運(yùn)行過程中可能出現(xiàn)的異常,以便調(diào)用者根據(jù)不同的異常類型預(yù)先定義不同的處理方式;throw用來拋出封裝了異常信息的對象,程序在執(zhí)行到throw時后續(xù)的代碼將不再執(zhí)行,而是跳轉(zhuǎn)到調(diào)用者,并將異常信息拋給調(diào)用者。也就是說,throw后面的語句塊將無法被執(zhí)行(finally語句塊除外)。

主站蜘蛛池模板: 尼勒克县| 东兰县| 台前县| 新源县| 多伦县| 唐海县| 子长县| 天台县| 广州市| 沂水县| 调兵山市| 广丰县| 清镇市| 全南县| 抚顺市| 监利县| 南丹县| 丹东市| 四川省| 吉安市| 莆田市| 临湘市| 阜宁县| 垫江县| 丰台区| 句容市| 南陵县| 观塘区| 藁城市| 呼和浩特市| 巨鹿县| 宝兴县| 潼关县| 水富县| 炉霍县| 禄丰县| 南康市| 延川县| 色达县| 古交市| 古田县|