2

我正在尝试实现我的第一个自定义RuntimeException

public class MyException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    private boolean isFizz;
    private boolean isBuzz;
    private Widget widget;

    public class MyException(boolean isFizz, boolean isBuzz, Widget widget) {
        super();

        setIsFizz(isFizz);
        setIsBuzz(isBuzz);
        setWidget(widget);
    }

    // Getters and setters for all 3 properties...

    @Override
    public String toString() {
        System.out.println("MyException is now in string form.");
    }
}

当我去测试这个时:

MyException exc = new MyException(false, true, new Widget());

System.out.println(exc.toString());
System.out.println(exc.getMessage());

我得到:

MyException is now in string form.
null

所以getMessage()行不通。我希望两者都toString()生成getMessage()相同的字符串,我认为Throwable#getMessage()只是简单地返回了toString().

所以我问:什么是“正常”的覆盖方式getMessage()我真的必须像这样覆盖它吗toString(),就像这样:

@Override
public String getMessage() {
    return toString();
}

或者,还有更好的方法?提前致谢。

4

3 回答 3

1

您还没有设置消息,因此getMessage()肯定会返回null

RuntimeException在您的构造函数中,您正在调用via ...的无参数构造函数,super()您需要调用super(message)(或其他两个接受消息的构造函数之一)并提供消息。

于 2013-02-09T20:48:48.463 回答
1

以为Throwable#getMessage()索性回来了toString()

你搞错了。 getMessage()返回传递给超类构造函数的任何消息:

 public MyException(boolean isFizz, boolean isBuzz, Widget widget) {
    super("This is the message");

并且默认实现toString()返回异常类名,后跟消息。

于 2013-02-09T20:48:55.247 回答
0

您可以在构造函数中将消息传递给您的父Exception类,例如

public class MyException(boolean isFizz, boolean isBuzz, Widget widget) {     
 super("MyException is now in string form.");

}
于 2013-02-09T20:48:17.133 回答