让Java Exception子类'getMessage()工作

时间:2013-02-09 20:44:59

标签: java exception tostring

我正在尝试实现我的第一个自定义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();
}

还是有更好的方法吗?提前谢谢。

3 个答案:

答案 0 :(得分:1)

您尚未设置消息,因此getMessage()肯定会返回null

在你的构造函数中,你通过RuntimeException调用super()的no-arg构造函数...你需要调用super(message)(或者另外两个构造函数中的一个)消息)并提供消息。

答案 1 :(得分:1)

  

Throwable#getMessage()只返回toString()

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

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

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

答案 2 :(得分:0)

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

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

}