Java異常處理體系
阿新 • • 發佈:2022-03-27
異常機制
異常的體系架構
異常的定義
- 在實際工作中,遇到的情況不可能都是完美的,使用者在使用過程中不會完全按照你的要求來進行,例如:使用者的輸入不一定符合你的要求,我們程式在執行,記憶體或磁碟可能滿了等等問題
- 軟體程式在執行過程中,非常可能遇到這些情況,我們將這些情況叫做異常,英文名為:Exception,這些例外情況也就是異常,我們在寫程式的時候需要解決,做出合理的處理,而不至於程式崩潰
- 異常的發生在程式執行期間,它會影響了正常的程式執行流程
異常的分類
- 檢查性異常:最具有代表的檢查性異常是使用者錯誤或問題引發的異常,這是程式設計師無法遇見的,例如要開啟一個不存在的檔案時,一個異常就發生了,這些異常在編譯時不能被簡單的忽略
- 執行時異常:執行時異常是可能被程式設計師避免的異常,與檢查性異常相反,執行時異常可以在編譯時被忽略
- 錯誤:錯誤不是異常,而是脫離程式設計師控制的問題,錯誤在程式碼中通常被忽略,例如:當棧溢位時,一個錯誤就發生了,他們在編譯也檢查不到的。
架構體系
- java中把異常當做物件來處理,並定義了一個基類為:java.lang.Throwable作為所有異常的超類
- 在Java API中已經定義了許多異常類,這些異常類被分為了兩大類,錯誤Error和異常Exception
Error
- Error類物件有Java虛擬機器生成並丟擲,大多數錯誤與程式碼編寫者所執行的操作無關
- Java虛擬機器執行錯誤(virtual MachineError),當Jvm不再有繼續執行操作所需的記憶體資源時,將出現OutOfMemoryError。這些異常發生時,Java虛擬機器(jvm)一般會選擇執行緒終止
- 還有發生在虛擬機器試圖執行運用時,如類定義錯誤(NoClassDeFoundError),連結錯誤(LinkageError)。這些錯誤是不可查的,因為他們在應用程式的控制和處理能力之外,而且絕大多數是程式執行時不允許出現的狀況。
Exception
- Exception分支中有一個重要的子類RuntimeException(執行時異常):
-
- ArrayIndexOutofBoundException(陣列下標越界)
- NullPointerException(空指標異常)
- ArithmeticException(算術異常)
- MissingResourceException(丟失資源異常)
- ClassNotFoundException(找不到類)
- 等等異常,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理
- 這些異常一般是由於程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這些異常的發生
Error和Exception的區別
Error通常是災難性的致命的錯誤,是程式無法控制和處理的,當出現這些異常時,jvm一般會選擇終止執行緒;Exception通常情況下是可以被程式處理的,並且在程式中應該儘可能的去處理這些異常
Java的異常處理機制
丟擲異常
throw關鍵字:
public static void main(String[] args) {
new Demo02().test(1,2);
}
public void test(int a ,int b)
{
if(b==0){
throw new ArithmeticException(); //主動丟擲異常,一般在方法中
}
}
throws關鍵字
public void test(int a ,int b) throws ArithmeticException
{
System.out.println(a/b);
}
捕獲異常
nt a=1;
int b=0;
try {//try監控區域
System.out.println(a/b);
}catch (ArithmeticException e){ //捕獲異常,當發生異常的時候執行該程式碼塊 catch裡面的引數是想要捕獲的異常型別並且可以捕獲多個異常
//如果要捕獲多個異常 要從小到大的捕獲
System.out.println("輸入的資料有誤,程式發生異常");
}catch(Throwable e)
finally { // 處理善後工作,無論是否發生異常都會執行 該區域可以不使用,但是try和catch必須得有 finally可以用來關閉流 資源等
System.out.println("程式執行結束");
}
測試結果如下所示:
自定義異常
- 使用Java內建的異常類可以描述在程式設計時出現的大部分異常情況。除此之外,使用者還可以自定義異常。使用者自定義異常,只需繼承Exception類即可
- 在程式中使用自定義異常類,大體可以分為一下幾個步驟:
-
- 建立自定義異常類
- 在方法中通過throw關鍵字丟擲異常
- 如果在當前丟擲異常的方法中處理異常,可以使用try-catch語句捕獲並處理;否則在方法的宣告處通過throws關鍵字指明要丟擲給方法呼叫者的異常,繼續進行下一步操作
- 在出現異常方法的呼叫者中捕獲並處理異常