我正在尝试以最简单的方式定义自己的异常类,这就是我所得到的:
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
,不是吗?
答案 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");