Java自定義異常


我們可以建立自己(自定義)的異常類。它們必須擴充套件現有的異常類。

<Class Modifiers> class <Class Name> extends <Exception Class Name> {

}

<Class Name>是異常類名。在接下來的範例中,將建立一個MyException類,它擴充套件了java.lang.Exception類。

語法

自定義一個異常類的語法如下:

public class MyException  extends  Exception  {
}

異常類與Java中的任何其他類一樣。 通常不向異常類中新增任何方法。許多可用於查詢異常物件狀態的有用方法已經在Throwable類中宣告了。

自定義異常類建構函式

通常,異常類包括四個建構函式。所有建構函式將使用super關鍵字呼叫其超類的相應建構函式。

class MyException extends Exception {
  public MyException() {
    super();
  }

  public MyException(String message) {
    super(message);
  }

  public MyException(String message, Throwable cause) {
    super(message, cause);
  }

  public MyException(Throwable cause) {
    super(cause);
  }
}

第一個建構函式建立一個具有null的異常作為其詳細訊息。
第二個建構函式建立一個具有詳細訊息的異常。
第三和第四個建構函式允許通過包裝/不包含詳細訊息的另一個異常來建立異常。

自定義異常類之後,就可以丟擲MyException型別的異常。

throw new MyException("Your  message  goes  here");

可以在方法/建構函式宣告中的throws子句中使用MyException類,或者在catch塊中使用引數型別。

public void  m1()  throws   MyException  {
}

或捕獲異常類

try  {

}catch(MyException e)  {

}

Throwable類

下面的列表顯示了Throwable類的一些常用方法。
Throwable類是Java中所有異常類的超類。此表中顯示的所有方法在所有異常類中都可用。

方法 方法描述
Throwable getCause() 返回異常的原因。如果未設定異常的原因,則返回null
String getMessage() 返回異常的詳細訊息。
StackTraceElement[] getStackTrace() 返回堆疊跟蹤元素的陣列。
Throwable initCause(Throwable cause) 設定異常的原因。有兩種方法可以將異常設定為異常的原因。 其他方法是使用建構函式,它接受原因作為引數。
void printStackTrace() 在標準錯誤流上列印堆疊跟蹤。
void printStackTrace(PrintStream s) 將堆疊跟蹤列印到指定的PrintStream物件。
void printStackTrace(PrintWriter s) 將堆疊跟蹤列印到指定的PrintWriter物件。
String toString() 返回異常物件的簡短描述。

範例-1

以下程式碼演示了使用異常類的printStackTrace()方法。

public class Main {
  public static void main(String[] args) {
    try {
      m1();
    } catch (MyException e) {
      e.printStackTrace(); // Print the stack trace
    }
  }

  public static void m1() throws MyException {
    m2();
  }

  public static void m2() throws MyException {
    throw new MyException("有異常或錯誤發生,鬼知道發生了什麼,先丟擲來再說!");
  }
}
class MyException extends Exception {
  public MyException() {
    super();
  }

  public MyException(String message) {
    super(message);
  }

  public MyException(String message, Throwable cause) {
    super(message, cause);
  }

  public MyException(Throwable cause) {
    super(cause);
  }
}

上面的程式碼生成以下結果。

範例-2

以下程式碼顯示了如何將異常的堆疊跟蹤寫入字串中。

import java.io.PrintWriter;
import java.io.StringWriter;

public class Main {
  public static void main(String[] args) {
    try {
      m1();
    } catch (MyException e) {
      String str = getStackTrace(e);
      System.out.println(str);
    }
  }
  public static void m1() throws MyException {
    m2();
  }

  public static void m2() throws MyException {
    throw new MyException("有異常或錯誤發生,鬼知道發生了什麼,先丟擲來再說!");
  }

  public static String getStackTrace(Throwable e) {
    StringWriter strWriter = new StringWriter();
    PrintWriter printWriter = new PrintWriter(strWriter);
    e.printStackTrace(printWriter);

    // Get the stack trace as a string
    String str = strWriter.toString();

    return str;
  }
}

class MyException extends Exception {
  public MyException() {
    super();
  }

  public MyException(String message) {
    super(message);
  }

  public MyException(String message, Throwable cause) {
    super(message, cause);
  }

  public MyException(Throwable cause) {
    super(cause);
  }
}

上面的程式碼生成以下結果。