如何在Java中定义自定义异常类,最简单的方法?

我试图用最简单的方式定义我自己的异常类,这就是我得到的:

public class MyException extends Exception {}


public class Foo {
public bar() throws MyException {
throw new MyException("try again please");
}
}

这是Java编译器说的:

cannot find symbol: constructor MyException(java.lang.String)

我感觉这个构造函数必须从java.lang.Exception继承,不是吗?

408682 次浏览

不,你不“继承”非默认构造函数,你需要在你的类中定义一个接受String的构造函数。通常在构造函数中使用super(message)来调用父构造函数。例如,像这样:

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

如果从Exception继承,则必须提供一个以String作为参数的构造函数(它将包含错误消息)。

我定义的一个典型自定义异常是这样的:

public class CustomException extends Exception {


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


public CustomException(String message, Throwable throwable) {
super(message, throwable);
}


}

我甚至使用Eclipse创建了一个模板,这样我就不必一遍又一遍地编写所有的东西。

原因在Java平台的< >强继承< / >强文章中解释了,文中说:

子类继承所有成员(字段、方法和嵌套) 类)从它的超类。构造函数不是成员,所以他们 不是由子类继承,而是由超类的构造函数继承 可以从子类调用。" < / p >

异常类有两个构造函数

  • public Exception()——这构造了一个异常,没有任何额外的信息。异常的性质通常从类名推断出来。
  • public Exception(String s)——构造带有指定错误消息的异常。详细消息是一个字符串,用于描述此特定异常的错误条件。
package customExceptions;


public class MyException extends Exception{


public MyException(String exc)
{
super(exc);
}
public String getMessage()
{
return super.getMessage();
}
}

import customExceptions.MyException;


public class UseCustomException {


MyException newExc=new MyException("This is a custom exception");


public UseCustomException() throws MyException
{
System.out.println("Hello Back Again with custom exception");
throw newExc;
}


public static void main(String args[])
{
try
{
UseCustomException use=new UseCustomException();
}
catch(MyException myEx)
{
System.out.println("This is my custom exception:" + myEx.getMessage());
}
}
}

如果你在Eclipse中使用新的类对话框,你可以将超类字段设置为java.lang.Exception,并勾选“Constructors from Superclass”,它将生成以下内容:

package com.example.exception;


public class MyException extends Exception {


public MyException() {
// TODO Auto-generated constructor stub
}


public MyException(String message) {
super(message);
// TODO Auto-generated constructor stub
}


public MyException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}


public MyException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}


}

对于下面关于不在默认构造函数中调用super()的问题,Oracle有这就是说:

注意:如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。

不要忘记抛出异常的最简单方法(您不需要创建类)

if (rgb > MAX) throw new RuntimeException("max color exceeded");