概述
頂級父類:Throwable
1、錯誤:Error
需要重寫代碼,工程師無法解決,只能儘量避免,如堆棧溢出錯誤,好比是絕症。
2、異常:Exception
異常是可以處理的,好比是感冒,工程師可以解決。
- 分類
- 編譯時期異常
編譯器會直接把代碼標紅 - 運行時期異常:RuntimeException
編譯器不會直接報出,只有在運行的時候纔會被捕捉到
3、創建異常
throw new 異常對象
4、處理異常
1、throw
拋出異常,將異常拋給調用者不親自在存在異常的地方進行處理,只要不在線程中可以一直往上拋,直到拋到JVM處,JVM將異常信息打印出來,結束程序。
2、try … catch
- try寫的是可能出現異常的代碼
- catch寫的是捕獲異常,處理異常的邏輯
異常對象的常用方法:
String getMessage():獲取異常描述信息,原因(提示給用戶的時候,就提示錯誤原因)
String toString():獲取異常的類型和異常描述信息(不用)
void printStackTrace():打印異常跟蹤棧信息並輸出到控制檯 --> 常用
- 注意事項:
a. 拋多少異常,就能捕獲多少,或者直接捕獲父類異常對象
b. 多catch的時候,上面不要先捕獲父類異常 - 快捷鍵 :Ctrl + Alt + T
3、finally
一定會執行的代碼,跟隨actch使用
兩種處理異常的區別
- throws:直接向上拋出,自己不做具體處理,拋給調用者(不要一味着向上拋)
- try catch finally:不交給JVM了,我們自己處理,一般作爲統一處理
總結
- 運行時期異常:不用代碼處理,證明你寫代碼有問題,自己去改
- 編譯時期異常:一般我們直接throws或者try…catch
5、自定義異常
- 創建一個類,繼承Exception:此自定義異常爲編譯時期異常
- 創建一個類,繼承RuntimeException:次異常爲運行時異常
- 注意事項:運行時期異常一般不用管,因爲不好發現
/**
* 自定義異常
*/
public class RegisterException extends Exception {
public RegisterException() {
}
public RegisterException(String message) {
super(message);
}
}
/*
模擬註冊
1.輸一個姓名
2.判斷輸入的姓名是否在集合中
2.1 在集合中拋出異常
2.2 不在集合中,註冊成功
*/
public class Test {
public static void main(String[] args) throws RegisterException {
String[] arr = {"濤哥","蒼老師","熱巴","佟麗婭"};
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
register(arr, name);
System.out.println("註冊成功");
}
private static void register(String[] arr, String name) throws RegisterException {
for (int i=0;i<arr.length;i++) {
if(name.equals(arr[i])){
throw new RegisterException("用戶已經存在");
}
}
}
}
JDK7新特性
try(定義流對象){
可能出現異常的邏輯代碼
}catch(){
捕獲異常
}
這樣的話,不用現在try…catch代碼塊之外定義變量,可以使得編碼更加簡潔和優雅一些。