Java學習 (26) 異常篇 異常結構&異常處理&自定義異常
異常結構
異常的定義
- 異常指程序運行中出現的不期而至的各種狀況,如:文件找不到、網絡連接失敗、非法參數等
- 異常發(fā)生在程序運行期間,它影響了正常的程序執(zhí)行流程
- 程序出現異常時,輸出框會爆紅并提示異常類型
異常的分類
-
異常分為三類:
- 檢查性異常:最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預見的。
- 運行時異常:運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異常可以在編譯時被忽略。
- 錯誤ERROR:錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。
-
Java 把異常當作對象來處理,并定義一個基類 java.lang.Throwable 作為所有異常的超類
-
在 Java API 中已經定義了許多異常類,這些異常類分為兩大類,錯誤Error 和異常 Exception

Error
- Erro r類對象由 Java 意擬機生成并拋出,大多數錯誤與代碼編寫者所執(zhí)行的操作無關
- Java 虛擬機運行錯誤 (Virtual MachineError),當 JVM 不再有繼續(xù)執(zhí)行操作所需的內存資源時,將出現 OutOfMemoryError。這些異常發(fā)生時、Java虛擬機(JV)一般會選擇線程終止
- 發(fā)生在虛擬機試圖執(zhí)行應用時,如類定義錯誤 (NoClassDefFoundError) 、鏈接錯誤 (LinkageError) 。這些錯誤是不可查的,因為它們在應用程序的控制和處理能力之外,而且絕大多數是程序運行時不允許出現的狀況
- 避免此情況發(fā)生
Expection
-
在Exception分支中有一個重要的子類 RuntimeException (運行時掉常)
- ArrayIndexOutOfBoundsException (數組下標越界)
- NullPointerException (空指針異常)
- ArithmeticException (算術異常)MissingResourceException(丟失資源)
- ClassNotFoundException (找不到類)
-
這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理
-
這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發(fā)生
-
優(yōu)秀的程序員不允許出現異常!
Error和Exception的區(qū)別
- Error通常是災難性的致命的錯誤,是程序無法控制和處理的,當出現這些異常時,Java 虛擬機(JVM)一般會選擇終止線程
- Exception通常情況下是可以被程序處理的,并且在程序中應該盡可能的去處理這些異常
具體講解視頻
異常01:Error和Exception_嗶哩嗶哩_bilibili
異常處理
- 異常處理機制分為捕獲異常和拋出異常
捕獲異常
- 捕獲異常使用 try-catch 來進行捕獲異常
- 捕獲異常需要知道該異常的類型
- finally
- finally 存在方法中時,無論能否判斷出異常,都會正常輸出
- finally 是處理拋出異常后的工作(比如關閉該方法)
- 捕獲異常可以不寫 finally
- finally會在程序沒進入 try 就報錯的情況下不執(zhí)行
- 如果要捕獲多個異常,捕獲順序是從小到大
語法實例
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
System.out.println(a/b);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
System.out.println("重新輸入數據");
}
}
- 多個異常捕獲
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
System.out.println(a/b);
}catch (Exception e){
System.out.println("Exception");
} catch (Error t){
System.out.println("Error");
}catch (Throwable e){
System.out.println("Throwable");
} finally {
System.out.println("重新輸入數據");
}
}
拋出異常
- 拋出異常使用 throw、throws 來進行拋出異常
- 使用 throw /throws 拋出異常時,需要 添加 try-catch 使代碼能夠在被拋出異常后仍能正常運行
- throw 在方法體運行,throws 在方法上運行
語法實例
public static void main(String[] args) {
try {
new Text().text(1,0);
} catch (ArithmeticException e) {
throw new RuntimeException(e);
}
}
//如果方法內無法處理此異常,通過 throws 在方法上拋出異常
public void text(int a,int b) throws ArithmeticException{
if (b == 0){//throw throws
//主動拋出異常,一般在方法中使用
throw new ArithmeticException();
}
System.out.println(a/b);
}
具體講解視頻
自定義異常
- 使用Java內置的異常類可以描述在編程時出現的大部分異常情況。除此之外,用戶還可以自定義異常
- 用戶自定義異常類,只需繼承 Exception 類即可
- 在程序中使用自定義異常類,大體可分為以下幾個步驟
- 創(chuàng)建自定義異常類
- 在方法中通過 throw/throws 關鍵字拋出異常對象
- 如果在當前拋出異常的方法中處理異常,可以使用 try-catch 語句捕獲并處理;否則在方法的聲明處通過throws關鍵字指明要拋出給方法調用者的異常,繼續(xù)進行下一步操作
- 在出現異常方法的調用者中捕獲并處理異常
浙公網安備 33010602011771號