Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中定义自定义异常类,最简单的方法?_Java_Exception_Inheritance - Fatal编程技术网

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

如何在Java中定义自定义异常类,最简单的方法?,java,exception,inheritance,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.lan

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

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)
我觉得这个构造函数必须继承自,不是吗?

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

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

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

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

}

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

我定义的典型自定义异常如下:

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

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

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

}

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

Java平台的文章解释了这一点,文章中说:

子类继承所有成员(字段、方法和嵌套 类)。构造函数不是成员,因此 不是由子类继承的,而是由超类的构造函数继承的 可以从子类调用。”


异常类有两个构造函数

  • public Exception()
    ——这构造了一个没有任何附加信息的异常。异常的性质通常从类名推断出来
  • 公共异常(字符串s)
    --构造具有指定错误消息的异常。详细消息是描述此特定异常的错误条件的字符串


如果在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:

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


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


我认为你也应该加上理由。事实上,那是不正确的。如果您的代码使用带有一个字符串参数的构造函数,那么您必须声明它。但是,可以在没有显式构造函数的情况下定义异常子类。。。因为Exception有一个无参数构造函数。@vulkanino:否。编译器会为每个没有定义自己构造函数的类添加默认构造函数。如果你定义了一个显式构造函数,即使超类有它,你也不会得到默认值;如果你的类没有构造函数,你也会得到默认值,即使超类没有构造函数。
如果你的类没有构造函数,你会得到默认值,即使超类没有它。
最后一部分是不可能的,除非该超类具有该类可以访问的默认构造函数(可能受保护或包保护)。否则必须显式调用父构造函数之一,否则编译将失败。请添加
MyException(Throwable)
MyException(String,Throwable)
构造函数以正确支持。近3年后,没有添加任何额外的构造函数:(@BrandonIbbotson你所说的“他们”是什么意思?他们添加到哪里了?如果你所说的“他们”是超类构造函数,而“哪里”是子类,那么你错了。超类构造函数不是隐式添加到子类中的。另外,我在前面的句子中看不到任何其他主题来引用这些词。这会返回什么?它会返回什么只需打印出UseCusomeException构造函数中的“Hello Back with custom exception”,异常将被抛出,然后在main中捕获,并打印出“This is my custom exception:This is custom exception:This is custom exception”。实际上,自Java 1.4以来,还有两个构造函数:
public exception(Throwable)
公共异常(字符串,可丢弃)
。它们需要正确地支持。@Danilopiazzalanga同意你的观点。来源:构造函数摘要在Eclipse中创建类时,你可以扩展Exception,你将得到所有四个构造函数。你不需要模板。我们什么时候应该使用第二个构造函数而不是第一个构造函数?为什么不需要使用default构造函数调用
super()
if (rgb > MAX) throw new RuntimeException("max color exceeded");