我們可以創(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è)構(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
類是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() | 返回異常對象的簡短描述。 |
以下代碼演示了使用異常類的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é)果。
以下代碼顯示了如何將異常的堆棧跟蹤寫入字符串中。
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é)果。