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

时间:2010-09-23 07:51:14

标签: java exception inheritance

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

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,不是吗?

8 个答案:

答案 0 :(得分:393)

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

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

答案 1 :(得分:89)

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

public class CustomException extends Exception {

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

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

}

我甚至使用Eclipse创建了一个模板,因此我不必一遍又一遍地编写所有内容。

答案 2 :(得分:58)

如果在Eclipse中使用新类对话框,只需将超类字段设置为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
    }

}

在回答下面关于不在defualt构造函数中调用super()的问题时,Oracle有this to say

  

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

答案 3 :(得分:22)

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

  

“子类继承所有成员(字段,方法和嵌套   来自其超类的类)。 构造函数不是成员,所以他们   不是由子类继承,而是超类的构造函数   可以从子类调用。“

答案 4 :(得分:19)

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

答案 5 :(得分:2)

异常类有两个构造函数

  • public Exception() - 这构造了一个Exception,没有任何附加信息。通常从类名推断出异常的属性。
  • public Exception(String s) - 使用指定的错误消息构造一个异常。详细消息是一个描述此特定异常的错误条件的String。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

也不要忘记引发异常的最简单方法(您无需创建类)

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