1. 程式人生 > >Java中的Exception異常 自定義異常

Java中的Exception異常 自定義異常

public class Exception
    extends Throwable
Exception 類及其子類是 Throwable 的一種形式,它指出了合理的應用程式想要捕獲的條件。
public class RuntimeException
    extends Exception
RuntimeException 是那些可能在 Java 虛擬機器正常執行期間丟擲的異常的超類。
可能在執行方法期間丟擲但未被捕獲的 RuntimeException 的任何子類都無需在 throws 子句中進行宣告。
1、異常的分類: ① 非執行時異常(Checked Exception)

Java中凡是繼承自Exception但不是繼承自RuntimeException的類都是非執行時異常

② 執行時異常(Runtime Exception/Unchecked Exception)

a) RuntimeException類直接繼承自Exception類,稱為執行時異常。Java中所有的執行時異常都直接或間接的繼承自RuntimeException.

Java中所有的異常類都直接或間接的繼承自Exception。

2、異常的處理:

對應非執行時異常,必須對其進行處理。處理方式有兩種:

使用try…catch…finally語句塊進行捕獲
在產生異常的方法所在的方法宣告throws Exception

對於執行時異常,可以不對其進行處理,也可以對其進行處理。一般情況下都不對其進行處理。

3、捕獲異常:
try {
    FileInputStream fs = new FileInputStream("D:/temp/a.txt");
} catch (FileNotFoundException e) {
    System.out.println("catch...");
    e.printStackTrace();
} finally{
    System.out.println("finally...");
}
4、丟擲和捕獲異常: 4.1、把異常交給JVM處理:
public class ExceptionTest {

    public static
void execute() throws Exception { System.out.println("execute..."); throw new Exception(); } public static void main(String[] args) throws Exception { execute(); } }
4.2、或者使用try catch語句塊捕獲異常:
public class ExceptionTest {

    public static void execute() throws Exception {
        System.out.println("execute...");
        throw new Exception();
    }

    public static void main(String[] args) {
        try {
            execute();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}
5、自定義異常:

自定義異常通常是定義一個繼承自Exception類的子類。一般情況下我們都會直接繼承自Exception類,而不會繼承某個執行時的異常類。

5.1、建立自定義異常:
public class MyException extends Exception{
    public MyException(){
        super();
    }
    public MyException(String msg){
        super(msg);
    }
}
5.2、在類中使用異常:
public class ExceptionTest {

    public static void execute(String a) throws MyException {
        System.out.println("execute...");
        if("true".equals(a)){
            throw new MyException("引數不能為 true");
        }
    }
}
5.3、捕獲自定義異常:
public static void main(String[] args) throws MyException {

    execute("true");
}
6、異常使用注意事項:

當使用多個catch語句塊來捕獲異常時,需要將父類的catch語句塊放到子型別的catch塊之後,這樣才能保證後續的catch可能被執行,否則子型別的catch將永遠無法到達,Java編譯器會報編譯錯誤。

如果try語句塊中存在return語句,那麼首先會執行finally語句塊中的程式碼,然後才返回。

如果try語句塊中存在System.exit(0)語句,那麼久不會執行finally語句塊的程式碼了,因為System.exit(0)會終止當前執行的JVM。程式在JVM終止前結束執行。