如何在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");