1. 程式人生 > >JAVA進階(01)異常處理

JAVA進階(01)異常處理

一、概述(Exception)

二、異常分類

1、繼承結構

   

   說明:

  • ClassNotFoundException 不屬於執行時異常 

2、error

(1)Error與Exception的區別

  • 我開著車走在路上,一頭豬衝在路中間,我剎車,這叫一個異常。
  •  我開著車在路上,發動機壞了,我停車,這叫錯誤,系統處於不可恢復的崩潰狀態。

3、exception

(1)RuntimeException

  • 合適的異常處理器:異常處理器所能處理的異常型別與方法丟擲的異常型別相符;
  • 執行時系統從發生異常的方法開始,向上回溯檢查直接或間接呼叫過此方法的方法,尋找合適的異常處理器,最後沒找到就拋給 JVM 來處理;
  • RuntimeException的異常,如被 0 除、陣列下標越界、空指標等,可以直接交給系統處理,可以使用異常處理機制來處理,最好的是提高程式設計邏輯來避免這些異常;
  • 幾種常見執行時異常的處理
1、NullPointerException異常:增加非空判斷;
2、ClassCastException異常:先用 instanceof 判斷;
3、ArrayIndexOutOfBoundsException異常:增加邊界判斷(a < arr.length);
4、NumberFormatException異常:先用正則判斷再轉
        
        String str = "1234abcf";
        Pattern p = Pattern.compile("^\\d+$");
        Matcher m = p.matcher(str);
        if (m.matches()) { // 如果str匹配代表數字的正則表示式,才會轉換
            System.out.println(Integer.parseInt(str));
        }

(2)CheckedException

  • 所有不是RuntimeException的異常,統稱為Checked Exception,如IOException、SQLException、自定義異常等。
  • 這類異常在編譯時就必須做出處理,否則無法通過編譯。

 

三、異常處理

1、捕獲異常

(1)格式

 
try{
  // 程式程式碼
}catch(異常型別1 異常的變數名1){
  // 程式程式碼
}catch(異常型別2 異常的變數名2){
  // 程式程式碼
}finally{
  // 程式程式碼
}

(2) 說明

  • catch 不能獨立於 try 存在
  • 在 try/catch 後面新增 finally 塊並非強制性要求的
  • try 程式碼後不能既沒 catch 塊也沒 finally 塊
  • try, catch, finally 塊之間不能新增任何程式碼
  • 其中多catch子類在前,父類在後
  • 即使try和catch塊中存在return語句,finally語句也會執行,執行順序是執行完finally語句後再通過return退出
  • finally 中通常是來關閉資源
  • 當異常處理的程式碼執行結束以後,不會回到try語句去執行尚未執行的程式碼

(3)異常列印

  • e.toString ()方法,顯示異常的類名和產生異常的原因
  • e.getMessage()方法,只顯示產生異常的原因,但不顯示類名
  • e.printStackTrace()方法,用來跟蹤異常事件發生時堆疊的內容

(4)練習程式碼

public class Test8 {
    public static void main(String[] args) {
        FileReader reader = null;
        try {
            reader = new FileReader("d:/a.txt");
            char c = (char) reader.read();
            char c2 = (char) reader.read();
            System.out.println("" + c + c2);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

2、宣告異常

(1)方法中

public void deposit(double amount) throws RemoteException
  {
    throw new RemoteException();
  }

(2)方法宣告中

public void withdraw(double amount) throws RemoteException,
                              InsufficientFundsException
{
    // Method implementation
}

(3)說明:一般在方法裡丟擲異常,方法宣告上也拋,執行時異常除外,執行時異常不具有程式碼侵入性; 

 

四、自定義異常

1、寫一個 檢查性異常類,則需要繼承 Exception 類

2、寫一個 執行時異常類,那麼需要繼承 RuntimeException 類

3、說明:

  • 異常往往在高層處理;
  • 不要進行小粒度的異常處理,應該將整個任務包裝在一個try語句塊中;