1. 程式人生 > >Java——異常與捕獲

Java——異常與捕獲

幾乎所有的程式碼裡面都會出現異常,為了保證程式在出現異常之後可以正常執行完畢,就需要進行異常處理。

異常的繼承類結構:

所有的異常都是由Throwable繼承而來。

Error類:描述Java執行時內部錯誤與資源耗盡錯誤。這種內部錯誤一旦出現,除了告知使用者並使程式安全終止之外,再無能為力。

Exception類(程式出錯)

IOException:程式本身沒問題,由於IO處理導致的程式出錯

RuntimeException:由於程式錯誤導致的。

一、異常分為兩大類:

1.非受查異常(無需強制處理):所有繼承於Error或RuntimeException的異常類稱為非受查異常

2.受查異常(需強制處理):所有繼承於Exception與IOException的類稱為受查異常

二、異常處理格式

try{

可能出現異常的語句

} [catch (異常類 物件)]{

出異常的操作

}[finally]{

異常出口

}

下面的格式都可以使用

try。。。catch。。。

try。。。finally。。。

try。。。catch。。。finally。。。

public class Test{
    public static void main(String[] args) {
        System.out.println("數學計算開始。。。");
        try {
            System.out.println("計算"+ 10 / 0);
        }catch (Exception e){
            System.out.println("分子不能為0");
            e.printStackTrace();
        }
        System.out.println("數學計算結束");
    }
}

無論是否產生異常,無論try catch是否有返回語句,最終都會執行finally塊

列印錯誤堆疊:進行完整異常資訊的輸出。

e.printStackTrace();

三、throws關鍵字——作用於方法上

在進行方法定義時,如果要明確告訴呼叫者本方法可能產生哪些異常,可以使用throws方法進行宣告,表示將異常拋回給呼叫方法。並且當方法出現問題後可以不進行處理。

public class Test{
    public static void main(String[] args){
        System.out.println("數學計算開始。。。");
        try {
            System.out.println("計算 " + fun(10, 0));
        }catch (Exception e){
            System.out.println("分子不能為0");
        }
        System.out.println("數學計算結束");
    }
    public static int fun(int a,int b)throws Exception{
        return a/b;
    }
}

在出現異常的fun方法中我沒有進行處理,而是通過throws拋給了呼叫fun方法的方法中。這時就需要在主方法中進行處理。

這時主方法也可以通過throws將異常丟擲,交給jvm處理。

四、throw關鍵字——用在方法中

thorw是直接編寫在語句之中,表示人為進行異常的丟擲。如果現在異常類物件例項化不希望由JVM產生而由使用者產
生,就可以使用throw來完成

public class Test{
    public static void main(String[] args){
    try {
        throw new Exception("拋個異常");
    }catch (Exception e){
        e.printStackTrace();
    }
    }
}

結果

一般而言throw和break、continue、break都要和if結合使用。

五、自定義異常類

在Java裡,針對於可能出現的公共的程式問題都會提供有相應的異常資訊,但是很多時候這些異常資訊往往不夠我
們使用。如果我們有這樣一個情況1+1不能等於2,那麼程式中出現1+1=2就是一個異常。

我們可以自定義一個異常類來供我們使用,自定義異常類可以繼承兩種父類:Exception、RuntimeException。

class AddException extends Exception{
    public AddException(String msg){
        super(msg);
    }
}
public class Test{
    public static void main(String[] args) throws Exception{
        int a = 1;
        int b = 1;
        if(a + b == 2 ){
            throw new AddException("1 + 1 不能等於2");
        }
    }
}

六、Exception與RuntimeException的區別
1. Exception是RuntimeException的父類,使用Exception定義的異常都要求必須使用異常處理,而使用RuntimeException定義的異常可以由使用者選擇性的來進行異常處理。
2. 常見的RuntimeException:ClassCastException、NullPointerException等。