Java 學習筆記(11)——異常處理

異常是程序中的一些錯誤,但並非全部的錯誤都是異常,而且錯誤有時候是能夠避免的。java

好比說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error;若是你用System.out.println(11/0),那麼你是由於你用0作了除數,會拋出 java.lang.ArithmeticException 的異常。程序員

Java中的異常主要分爲下列幾類:函數

  1. 檢查性異常:最具表明的檢查性異常是用戶錯誤或問題引發的異常,這是程序員沒法預見的。例如要打開一個不存在文件時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。
  2. 運行時異常: 運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異常能夠在編譯時被忽略。
  3. 錯誤: 錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中一般被忽略。例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的。

全部的異常類是從 java.lang.Exception 類繼承的子類。 Exception 類是 Throwable 類的子類。除了Exception類外,Throwable還有一個子類Error 。它們之間的關係入下圖:code

異常類

從Exception繼承的類都是異常,異常能夠被處理,處理完後程序仍然能夠繼續運行。從Error繼承來的類都是錯誤,在運行時錯誤沒法被處理,只能修改代碼邏輯。從Runtime中繼承的類都是運行時異常,這類異常在程序中能夠處理,也能夠不處理。而非運行時異常在代碼中必須處理。否則編譯會報錯。對象

Java中異常處理的方式

Java中的異常處理主要有下列幾種:blog

  1. 使用 throw 在指定方法中拋出指定異常。好比 throw IOException(); 在方法中拋出了一個IO異常
  2. 使用 throws 將異常拋出給調用者處理。在函數聲明時使用。方法聲明時能夠拋出多個異常,若是多個異常有繼承關係,那麼只須要拋出父類異常便可。若是父類的方法沒有拋出異常,子類在重寫父類方法時也不能使用這種方式拋出異常
  3. try...catch 處理異常。

在使用try 處理異常時須要注意:繼承

  • 若是catch 中捕獲的有多個異常,且異常間有繼承關係,那麼必須把子類寫在前面,父類在後面

異常中的經常使用方法

Throwable 中定義了3個異常處理的方法:資源

  1. String getMessage(): 返回異常的詳細信息
  2. String toString(): 返回異常的簡短信息
  3. void printStackTrace(): 打印異常的調用信息

這些異常信息通常在try...catch 中使用,例如get

try
{
    //do something
}catch(Exception e){
    e.printStackTrace();
}

finally 關鍵字

不管異常是否發生,finally中的代碼都會執行。通常finally中編寫釋放資源的代碼,好比釋放文件對象。須要注意的是,finally中會改變return的執行順序,無論return在哪,都會最後執行finally中的returnit

try{
    //do some thing
    return;
}catch(Exception e)
{
    return;
}
finally{
    return; //會執行這個 
}

return;

自定義異常類

自定義異常時須要注意:

  • 異常類都必須繼承自 Throwable類,若是要定義檢查性異常,須要繼承 Exception,要定義運行時異常,須要繼承 RuntimeException
class MyException extends Exception{
}

假設咱們定義一個異常類,表示取錢的異常,當取錢數少於1000時報異常,提示用戶去ATM取,能夠這樣寫

class TooLittleMoneyException extends Exception
{
    private int money;
    private String message;

    TooLittleMoneyException(int money){
        message = "" + money + "太少,請到ATM自助取款機去取";
    }

    String getMessage(){
        return message;
    }
}

//取錢方法
//打開交易通道
//校驗帳戶是否合法
try{
    if (money < 1000){
        throw TooLittleMoneyException(money);
    }

    //取錢,並在對應帳戶中減小相應的金額
}catch(TooLittleMoneyException e){
    System.out.println(e.getMessage());
}finally{
    //關閉交易通道
}
相關文章
相關標籤/搜索