java捕獲和拋出異常


java 捕獲和拋出異常

​ 異常通常是程序運行時出現的問題和錯誤。如:客戶輸入數據的格式,讀取的文件是否存在,網絡是否保持通暢等。java程序在執行過程中發生的異常事件分為:異常和錯誤

異常:(Exception)

異常指程序運行過程中出現的非正常現象。可能遇到的輕微錯誤,可以寫代碼處理異常並繼續繼承執行,不應讓程序中斷。

錯誤:(Error)

錯誤事件的發生通常會阻止程序正常運行。對於java虛擬機無法解決的嚴重問題,如jvm系統內部錯誤,資源耗盡等情況,一般不編寫針對性的代碼進行處理。

對於被認為是不能恢復的嚴重錯誤,不應該拋出,而應該讓程序中斷。


錯誤與異常最大的區別是錯誤往往比異常嚴重,發生了錯誤,一般不能在應用程序中捕獲處理,程序只能非正常終止運行。

異常的簡單分類:

(1):檢查性異常

最具有代表性的是用戶錯誤或者是問題引起的而異常,這是程序員無法預見的。例如要打開一個不存在的文件時,異常就發生了,這些異常在編譯時不能被簡單的忽略。

(2):運行時異常

它是可能被程序員避免的異常,與檢查性異常相反,運行時可以在編譯時被忽略。

(3):錯誤

錯誤不是異常,而是脫離程序員控制的問題,錯誤在代碼中通常被忽略。例如當棧溢出時,一個錯誤就發生了,他們在編譯中也查不到。


java把異常當做對象來處理,並定義一個基類java.lang.Throwable作為所有異常的超類。

java異常層次結構圖如下:

異常處理機制(捕獲)

拋出異常:當出現異常事件時,系統會自動產生一個異常對象,然后將其傳遞給java運行時系統。這個異常產生和提交的過程稱為拋出異常。

捕獲異常:當java運行時系統得到異常對象以后,它將尋找處理這一異常的方法,找到之后,運行時系統把當前異常對象交給該方法進行處理。這一過程稱為捕獲。

異常處理的一般步驟為:異常拋出---->異常捕獲---->異常處理

java異常機制主要依賴於try,catch,finally,throwsthrow五個關鍵字。

try:它里面放置的是可能引發的異常類型。

catch:后面對應異常類型一個代碼塊,用於表明catch塊用於處理這種類型的代碼塊。可以有多個catch塊。

finally:主要用來處理后續事情。finally塊總是被執行,如果finally中使用了return或者throw等終止方法的語句,不會跳回執行,而是直接執行。

下面來兩個簡單的代碼示例:

分母不能為0的異常並捕獲
package exception;

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
   //     System.out.println(a/b);//出現異常,分母不能為0.ArithmeticException
        //下面我們來捕獲這個異常,try——catch
        try {//try    用來檢測區域
      //      System.out.println(a/b);
        }catch (ArithmeticException e){//catch(可能發生的異常類型)   捕獲異常
            System.out.println("程序出現異常,變量不能為0");
        }finally {//處理后續工作
            System.out.println("finally");
        }
    }
}
方法的棧調用異常並捕獲
public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
   //     System.out.println(a/b);//出現異常,分母不能為0.ArithmeticException
        //下面我們來捕獲這個異常,try——catch
        try {//try    用來檢測區域
              new Test().a();//通過對象點名來調用這個方法
        }catch (Throwable e){//catch(想要捕獲的異常類型)//   捕獲異常
            System.out.println("程序出現異常,變量不能為0");
        }finally {//處理后續工作
            System.out.println("finally");
        }
    }
    public void a(){ b(); }
    public void b(){ a(); }
}

當我們想捕獲多個異常時,可以像循環結構那樣,並列catch模塊

多個異常捕獲時
    /*
當我們想要捕獲多個異常時
catch(){

}catch(){

}catch(){
//括號內捕獲的異常類型要從小到大去寫。error>exception>throwable
}
 */
    我們可以通過快捷鍵alt+Ctrl+T選中含有異常的代碼語句,自動生成try-catch-finally。

throw語句

throw通常用來明確的拋出一個異常

if(異常條件1 成立)

​ throw new 異常1();

if(異常條件2 成立)

​ throw new異常2();

簡單代碼示例

在try檢測模塊內主動拋出異常
        try {//try    用來檢測區域
              if(b==0){//使用throw關鍵字來拋出
                  throw new ArithmeticException();//主動拋出這個異常
              }
            System.out.println(a/b);

throws語句

throws語句用來聲明一個異常。

public class Test {
    public static void main(String[] args) {
        try {
            new Test().test(1,0);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } finally {
        }
    }
    //假設方法中處理不了這個異常,需要在方法上拋出異常
    public void test (int a,int b) throws ArithmeticException{//在這個方法里聲明這個異常
        if (b == 0) {
            throw new ArithmeticException();//主動拋出的異常,一般在方法中
        }
        System.out.println(a / b);
    }
}

狂神說java


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM