鍍金池/ 教程/ Java/ Java自定義異常
Java參數(shù)傳遞
Java靜態(tài)內(nèi)部類
Java final關(guān)鍵字
http://www.yiibai.com/java_object_oriented_design/java_inheritan
Java泛型類
Java標(biāo)準(zhǔn)注解
Java接口教程
Java注解
Java枚舉類型
http://www.yiibai.com/java_object_oriented_design/java_class_ins
Java接口實(shí)現(xiàn)
Java哈希編碼
Java泛型約束
http://www.yiibai.com/java_object_oriented_design/java_import.ht
Java注解默認(rèn)值
Java異常拋出
Java不可變對象
Java類基礎(chǔ)
Java接口繼承
Java類方法
Java訪問級別
Java對象克隆
Java初始化塊
Java可變長度參數(shù)
Java接口字段
Java對象相等比較(Equals)
Java實(shí)例和靜態(tài)方法
Java繼承方法隱藏(覆蓋)
Java面向?qū)ο笤O(shè)計(jì)
Java對象finalize()方法
Java抽象類和方法
Java Object類
Java泛型方法和構(gòu)造函數(shù)
Java枚舉體
Java接口方法
Java this關(guān)鍵字
Java注解類型的限制
Java main()方法
Java Enum類
Java注解用法
Java枚舉比較
Java注解類型
Java內(nèi)部類成員
Java繼承和構(gòu)造函數(shù)
Java類實(shí)例化
Java內(nèi)部類類型
Java對象toString()方法
Java finally塊
Java繼承教程
Java自定義異常
Java枚舉值
Java接口作為類型
Java異常類
Java方法覆蓋教程
http://www.yiibai.com/java_object_oriented_design/java_class_bas
Java枚舉方法
Java方法重載
http://www.yiibai.com/java_object_oriented_design/java_interface
Java異常用法
Java內(nèi)部類
Java類成員訪問級別
Java異常處理教程
Java注解反射
Java構(gòu)造函數(shù)(構(gòu)造器)
Java導(dǎo)入(import語句的用法)

Java自定義異常

我們可以創(chuàng)建自己(自定義)的異常類。它們必須擴(kuò)展現(xiàn)有的異常類。

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

}

<Class Name>是異常類名。在接下來的示例中,將創(chuàng)建一個(gè)MyException類,它擴(kuò)展了java.lang.Exception類。

語法

自定義一個(gè)異常類的語法如下:

public class MyException  extends  Exception  {
}

異常類與Java中的任何其他類一樣。 通常不向異常類中添加任何方法。許多可用于查詢異常對象狀態(tài)的有用方法已經(jīng)在Throwable類中聲明了。

自定義異常類構(gòu)造函數(shù)

通常,異常類包括四個(gè)構(gòu)造函數(shù)。所有構(gòu)造函數(shù)將使用super關(guān)鍵字調(diào)用其超類的相應(yīng)構(gòu)造函數(shù)。

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);
  }
}

第一個(gè)構(gòu)造函數(shù)創(chuàng)建一個(gè)具有null的異常作為其詳細(xì)消息。
第二個(gè)構(gòu)造函數(shù)創(chuàng)建一個(gè)具有詳細(xì)消息的異常。
第三和第四個(gè)構(gòu)造函數(shù)允許通過包裝/不包含詳細(xì)消息的另一個(gè)異常來創(chuàng)建異常。

自定義異常類之后,就可以拋出MyException類型的異常。

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

可以在方法/構(gòu)造函數(shù)聲明中的throws子句中使用MyException類,或者在catch塊中使用參數(shù)類型。

public void  m1()  throws   MyException  {
}

或捕獲異常類

try  {

}catch(MyException e)  {

}

Throwable類

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

方法 方法描述
Throwable getCause() 返回異常的原因。如果未設(shè)置異常的原因,則返回null。
String getMessage() 返回異常的詳細(xì)消息。
StackTraceElement[] getStackTrace() 返回堆棧跟蹤元素的數(shù)組。
Throwable initCause(Throwable cause) 設(shè)置異常的原因。有兩種方法可以將異常設(shè)置為異常的原因。 其他方法是使用構(gòu)造函數(shù),它接受原因作為參數(shù)。
void printStackTrace() 在標(biāo)準(zhǔn)錯(cuò)誤流上打印堆棧跟蹤。
void printStackTrace(PrintStream s) 將堆棧跟蹤打印到指定的PrintStream對象。
void printStackTrace(PrintWriter s) 將堆棧跟蹤打印到指定的PrintWriter對象。
String toString() 返回異常對象的簡短描述。

實(shí)例-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("有異常或錯(cuò)誤發(fā)生,鬼知道發(fā)生了什么,先拋出來再說!");
  }
}
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);
  }
}

上面的代碼生成以下結(jié)果。

實(shí)例-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("有異常或錯(cuò)誤發(fā)生,鬼知道發(fā)生了什么,先拋出來再說!");
  }

  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);
  }
}

上面的代碼生成以下結(jié)果。