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

上面的代码生成以下结果。


上一篇:Java异常抛出

下一篇:Java finally块

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程