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

yeg*_*256 281 java inheritance exception

我正在尝试以最简单的方式定义自己的异常类,这就是我得到的:

public class MyException extends Exception {}

public class Foo {
  public bar() throws MyException {
    throw new MyException("try again please");
  }
}
Run Code Online (Sandbox Code Playgroud)

这就是Java编译器所说的:

cannot find symbol: constructor MyException(java.lang.String)
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,这个构造函数必须继承自己java.lang.Exception,不是吗?

djn*_*jna 398

不,您不"继承"非默认构造函数,您需要定义在类中使用String的那个.通常,您super(message)在构造函数中使用它来调用父构造函数.例如,像这样:

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @vulkanino:不会.编译器会为每个没有定义构造函数的类添加默认构造函数.如果定义了一个显式构造函数,即使超类具有默认构造函数,也不会获得默认构造函数,如果您的类没有构造函数,即使超类没有构造函数,也会得到默认值. (57认同)
  • 请添加`MyException(Throwable)`和`MyException(String,Throwable)`构造函数以正确支持[例外链接](http://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html). (42认同)
  • 差不多3年后,没有添加任何额外的构造函数.:( (7认同)
  • `如果你的类没有构造函数,即使超类没有它,你也会得到默认值.最后一部分是不可能的,除非超类有一个这个类可以访问的默认构造函数(可能受保护或受包保护).否则,您必须显式调用其中一个父构造函数,否则编译将失败. (5认同)
  • @BrandonIbbotson你对'他们'是什么意思,他们在哪里添加?如果你的意思是'他们'是超类构造函数,而'where'是子类,那么你错了.超类构造函数不会隐式添加到子类中.另外,我在前面的句子中看不到任何其他主题可供参考. (2认同)

nan*_*nda 90

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

public class CustomException extends Exception {

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

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

}
Run Code Online (Sandbox Code Playgroud)

我甚至使用Eclipse创建一个模板,所以我不必一遍又一遍地写所有的东西.

  • 您可以在Eclipse中创建类时扩展Exception,并且您将获得所有四个构造函数.您不需要模板. (17认同)

Kev*_*rey 58

如果在Eclipse中使用新类对话框,只需将Superclass字段设置为java.lang.Exception并检查"超类中的构造函数",它将生成以下内容:

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
    }

}
Run Code Online (Sandbox Code Playgroud)

在回答下面关于不调用super()defualt构造函数的问题时,Oracle有这样的说法:

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

  • ["如果子类构造函数没有指定要调用的超类构造函数,那么编译器将自动调用超类中的可访问no-args构造函数."](http://stackoverflow.com/a/2054040/2437516) (3认同)

小智 22

Java平台的继承文章解释了这一点的原因:

"子类从其超类继承所有成员(字段,方法和嵌套类).构造函数不是成员,因此子类不会继承它们,但可以从子类调用超类的构造函数."


小智 19

package customExceptions;

public class MyException extends Exception{

    public MyException(String exc)
    {
        super(exc);
    }
    public String getMessage()
    {
        return super.getMessage();
    }
}
Run Code Online (Sandbox Code Playgroud)
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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)