例外的簡單分類
- 檢查性例外:最具代表性的檢查性例外是用戶錯誤或問題引起的例外,這是程式員無法預見的,例如用戶要打開一個不存在的檔案,一個例外就發生了,這些例外在編譯時不能被簡單的忽略,
- 運行時例外:運行時例外是可能被程式員避免的例外,與檢查性例外相反,運行時例外可以在編譯時被忽略,
- 錯誤(error):錯誤不是例外,而是脫離程式員控制的問題,錯誤在代碼中通常被忽略,例如,當堆疊溢位時,一個錯誤就發生了,它們在編譯時也檢查不到,
Excetpion
在Exception分支中,有一個重要的子類:RuntimeException(運行時例外),包括:
- ArithmeticException,算術例外
- MissingResourceException,丟失資源例外
- ClassNotFoundException,找不到類
- NullPointerException,空指標例外
- IllegalArgumentException,非法引數例外
- ArrayIndexOutOfBoundsException,陣列下表越界例外等
這些例外時不檢查例外,程式中可以選擇捕獲處理,也可以選擇不處理,這些例外一般是由程式員邏輯錯誤引起,程式應該從邏輯角度盡可能避免這類例外的發生,
例外處理機制
例外處理一般有捕獲例外和拋出例外兩個程序,相關關鍵字有以下五個:try、catch、finally、throw、throws
int a = 1;
int b = 0;
try { //try里的是監控區域
System.out.println(a / b);
} catch (Error e) { //catch(想要捕獲的例外型別),最高是throwable
System.out.println("Error");
} catch (Exception e) { //可以捕獲多個例外,從上到下,例外的范圍要逐漸擴大,或者不相交
System.out.println("Exception");
} catch (Throwable t) { //例外的最高類別是Throwable
System.out.println("Throwable");
} finally { //處理善后作業
//finally不是必要的,但在某些場景,比如處理I/O流,需要關閉資源時,需要用來善后
System.out.println("finally");
}
throw和throws
throw用來主動拋出例外,throws則是在方法定義中拋出例外:
public class Test{
public static void main(String[] args){
int a = 1;
int b = 0;
new Test().test(a, b);
}
//使用throws在方法上拋出例外
public void test(int a, int b) throws ArithmeticException {
if (b == 0) {//throw throws
throw new ArithmeticException();//主動拋出例外,一般在方法中使用,假設這方法中處理不了這個例外,就在方法上拋出例外
}
System.out.println(a / b);
}
Error和Exception的區別:Error通常是災難性的致命錯誤,是程式無法控制和處理的,當出現這些例外時,Java虛擬機一般會選擇終止執行緒;Exception通常情況下是可以被程式處理的,并且在程式中應該盡可能地去處理這些例外,
自定義例外
Java內置的例外類可以描述在編程時出現的大部分例外情況,除此之外,用戶還可以自定義例外,用戶自定義例外類,只需要繼承Exception類即可,大致分為以下幾個步驟
- 創建自定義例外類
- 在方法中通過throw關鍵字拋出例外物件
- 如果在當前拋出的方法中處理例外,可以使用try-catch陳述句捕獲并處理;否則在方法的宣告處通過throws關鍵字指明要拋出給方法呼叫者的例外,繼續進行下一步操作,
- 在出現例外的方法的呼叫者中捕獲并處理例外,
//通過繼承Exception類,自定義例外
public class MyException extends Exception {
//用來檢查數字輸入例外
private int detail;
public MyException(int a) {
this.detail = a;
}
@Override
public String toString() {
return "MyException{" + detail + '}';
}
}
//測驗:
public class Test {
//將a>10定義為例外情況,并拋出自定義例外
static void test(int a) throws MyException {
System.out.println("傳遞的引數為:" + a);
if (a > 10) {
throw new MyException(a);
}
System.out.println("OK");
}
public static void main(String[] args) {
try {
Test.test(115);
} catch (MyException e) { //捕獲自定義例外,并列印資訊
System.out.println("MyException=>" + e);
}
}
}
自定義例外情況為:

實際應用中的經驗總結
- 處理運行時例外時,采用合適的邏輯去合理規避例外情況,同時使用try-catch輔助處理
- 在多種catch塊后面,可以加一個catch(Exception)來處理可能會被遺漏的例外
- 對于不確定的代碼,也可以加上try-catch,處理潛在的例外
- 盡量去處理例外,切忌只是簡單的呼叫printStackTrace()去列印輸出
- 具體如何處理例外,要根據不同的業務需求和例外型別去決定
- 盡量添加finally陳述句塊去釋放占用的資源,比在I/O流、Scanner場景中
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549110.html
標籤:Java
上一篇:代碼Bug太多?給新人Code Review頭都大了?快來試試SpotBugs
下一篇:鏈式呼叫
