java之Exception異常
阿新 • • 發佈:2019-01-02
異常
定義
程式執行過程中,出現了不正常的情況。最終導致JVM的非正常停止JAVA把這些問題描述成了異常類。出現了不正常就需要把問題報出來。
異常體系
java.lang.Throwable
執行時異常(不可檢測異常)
就是執行時由於程式碼邏輯或者jvm內部記憶體不足而導致程式崩壞。
- Error 錯誤,虛擬機器異常,系統級別的。
- Stack Over Flow Error:棧溢位誤差
- Out of Memory Error:記憶體不足錯誤。
- RuntimeException以及其子類,執行期異常,本異常是程式設計師的程式碼邏輯錯誤導致的,編譯器不會提示,採用預設處理規則。
- java.lang.NullPointerException:空指標異常,出現原因:呼叫了未經初始化的物件或者是不存在的物件。
- java.lang.ClassNotFoundException指定的類找不到;原因:類的名稱和路徑載入錯誤;通常都是程式試圖通過字串來載入某個類時可能引發異常。
- java.lang.NumberFormatException 字串轉換為數字異常;出現原因:字元型資料中包含非數字型字元。
- java.lang.IndexOutOfBoundsException 陣列角標越界異常,常見於運算元組物件時發生。
- java.lang.IllegalArgumentException 方法傳遞引數錯誤。
- java.lang.ClassCastException 資料型別轉換異常。
- java.lang.NoClassDefFoundException 未找到類定義錯誤。
- SQLException SQL 異常,常見於操作資料庫時的 SQL 語句錯誤。
- java.lang.InstantiationException 例項化異常。
- java.lang.NoSuchMethodException 方法不存在異常。
非執行時異常
可檢測異常,編譯時異常,非RuntimeException,編譯期異常,在寫程式碼的時候編譯器如果不給處理方式,就編譯不通。需要我們手動try或者丟擲的異常。
異常物件的常用方法
public void printStackTrace();
列印異常資訊,包含了異常的型別,異常的原因,還包括異常出現的位置,在開發和除錯階段,都得使用printStackTrace。public String getMessage();
獲取發生異常的原因,提示給使用者的時候就提示錯誤原因。public String toString();
獲取異常的型別和異常描述資訊(不用)。
異常處理
- throw 用在方法內部,用來丟擲異常物件。
- try-catch-finally
- try:用來檢測異常。
- catch:捕獲異常。
- finally:關閉資源,一定會執行,除了遇到System.exit();
注意:
1. 可以有多個catch,去捕捉
2. 在try後,出現了一個異常,後面的程式碼將不會繼續執行。
throw和throws區分
throw
作用:建立異常物件,當程式執行到此處時就會發生我們建立的異常,如果沒有處理try/catch,是直接跑給虛擬機器的那麼程式就會停止執行。
用法:在方法內使用。
格式:
throw new 異常類名()
throws
作用:當我們編寫程式碼時發生變異時異常,我們不想try/catch處理掉,那我們就可以使用throws把異常丟擲去,交給人處理,這裡誰使用本方法誰就去處理,如果是在主函式main方法中就把異常給丟擲去,那麼就是Jvm虛擬機器處理,他們的處理方式就是一旦發生異常就會讓程式停止執行。
格式:
public static void main(String[] args) throws InterruptedException{}
自定義異常類
格式:
1. 建立一個類,繼承Exception。
2. 根據父類的構造,生成一個可以新增異常資訊的構造方法。
3. 通過throw丟擲一個異常物件。
注意:
- 自定義執行時異常,繼承RunTimeException。
- 自定義編譯時異常,繼承Exception。
++問題:自定義異常實現使用者註冊使用者名稱重複的異常提醒。++
測試類Demo01.java
public class Demo01 {
//建立一個數組,模擬資料庫
static String[] arr = {"Tracy", "James", "Jon"};
public static void main(String[] args) throws LoginExcption {
//鍵盤錄入,模擬註冊時,輸入使用者名稱
Scanner sc = new Scanner(System.in);
String username = sc.nextLine();
//校驗使用者名稱是否存在
checkName(username);//如果出現異常後面的程式碼將不會繼續執行。
System.out.println("註冊成功");
}
//此方法用於校驗使用者名稱是否存在
public static void checkName(String username) throws LoginExcption {
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals(username)) {
throw new LoginExcption("使用者名稱已存在");
}
}
}
}
自定義異常類LoginExcption.java
public class LoginExcption extends Exception {
public LoginExcption() {
}
public LoginExcption(String message) {
super(message);
}
}