文章目錄
- 異常
- 異常處理
- 自定義異常
異常
指的是程序在執行過程中,出現的非正常的情況,最終會導致JVM的非正常停止。Java處 理異常的方式是中斷處理。
- 異常體系
異常的根類是 java.lang.Throwable,,其下有兩個子類:java.lang.Error 與 java.lang.Exception。
- 異常分類
編譯時期異常:checked異常
。在編譯時期,就會檢查,如果沒有處理異常,則編譯失敗。(如日期格式化異常)運行時期異常:runtime異常
。在運行時期,檢查異常.在編譯時期,運行異常不會編譯器檢測(不報錯)。(如數學異常)
異常處理
Java異常處理的五個關鍵字:try、catch、finally、throw、throws
- 拋出異常throw
使用格式:
throw new 異常類名(參數);
public class ExceptionDemo {public static int getElement(int[] arr , int index){if (index < 0 || index >= arr.length){throw new ArrayIndexOutOfBoundsException("數組下標越界啦!");}int element = arr[index];return element;}public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5};int index = 5;int element = getElement(arr, index);System.out.println(element);System.out.println("over");}
}
- 聲明異常throws
使用格式:
修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2…{ }
import java.io.FileNotFoundException;
import java.io.IOException;public class ExceptionDemo {public static void findFile(String file) throws FileNotFoundException,IOException{if (!file.equals("a.txt")){throw new FileNotFoundException("找不到文件");}int index = file.lastIndexOf(".");String prefix = file.substring(index);if (prefix.equals(".txt")){System.out.println("文件格式正確");}else {throw new IOException("文件格式不正確");}}public static void main(String[] args) throws IOException {String file = "a.txt";findFile(file);System.out.println("over");}
}
- 捕獲異常try…catch
Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理。
try{編寫可能會出現異常的代碼
}catch(異常類型 e){處理異常的代碼//記錄日志/打印異常信息/繼續拋出異常
}
- 該方法不處理,而是聲明拋出,由該方法的調用者來處理(throws)。
- 在方法中使用try-catch的語句塊來處理異常。
import java.io.IOException;public class ExceptionDemo {public static void findFile(String file) throws IOException{int index = file.lastIndexOf(".");String prefix = file.substring(index);if (prefix.equals(".txt")){System.out.println("文件格式正確");}else {throw new IOException("文件格式不正確");}}public static void main(String[] args){String file = "a.html";try {findFile(file);} catch (IOException e) {e.printStackTrace();System.out.println(e.getMessage());}System.out.println("over");}
}
Throwable類中定義了一些查看方法:
- public String getMessage() :獲取異常的描述信息,原因(提示給用戶的時候,就提示錯誤原因。
- public String toString() :獲取異常的類型和異常描述信息(不用)。
- public void printStackTrace() :打印異常的跟蹤棧信息并輸出到控制臺。
- finally 代碼塊
有一些特定的代碼無論異常是否發生,都需要執行。因此我們就會使用finally關鍵字來解決這個問題
import java.io.IOException;public class ExceptionDemo {public static void findFile(String file) throws IOException{int index = file.lastIndexOf(".");String prefix = file.substring(index);if (prefix.equals(".txt")){System.out.println("文件格式正確");}else {throw new IOException("文件格式不正確");}}public static void main(String[] args){String file = "a.html";try {findFile(file);} catch (IOException e) {e.printStackTrace();System.out.println(e.getMessage());} finally {System.out.println("不管出不出現異常都要執行!");}System.out.println("over");}
}
- 多個異常進行捕獲的方式:
- 多個異常分別處理。
- 多個異常一次捕獲,多次處理。
- 多個異常一次捕獲一次處理。
注意:
- 運行時異常被拋出可以不處理。即不捕獲也不聲明拋出。
- 如果finally有return語句,永遠返回finally中的結果,避免該情況.
- 如果父類拋出了多個異常,子類重寫父類方法時,拋出和父類相同的異常或者是父類異常的子類或者不拋出異常。
- 父類方法沒有拋出異常,子類重寫父類該方法時也不可拋出異常。此時子類產生該異常,只能捕獲處理,不能聲明拋出
自定義異常
異常類如何定義:
- 自定義一個編譯期異常: 自定義類 并繼承于 java.lang.Exception 。
代碼示例:
// 業務邏輯異常
public class MyException extends Exception {/*** 空參構造*/public MyException () {}/**** @param message 表示異常提示*/public MyException (String message) {super(message);}
}
- 自定義一個運行時期的異常類:自定義類 并繼承于 java.lang.RuntimeException 。
public class MyException extends RuntimeException {/*** 空參構造*/public MyException () {}/**** @param message 表示異常提示*/public MyException (String message) {super(message);}
}
總的來說就是,繼承異常類Exception或者RuntimeException,重寫空參構造方法和有參構造方法。
歡迎java熱愛者了解文章,作者將會持續更新中,期待各位友友的關注和收藏。。。