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)(またはメッセージを受け取る他の2つのコンストラクターの1つ)、メッセージを提供する必要があります。

于 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

You can pass the message to your parent Exception class in the constructor, e.g.

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

}
于 2013-02-09T20:48:17.133 に答える