JAVA進階(01)異常處理
阿新 • • 發佈:2018-11-28
一、概述(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語句塊中;