0

このようなコードで

public static void main(String[] args) {
    Exception one = new Exception("my cause");
    System.out.println("A) " + one.getMessage());

    System.out.println();

    Exception two = new Exception(one);
    System.out.println("B) " + two.getMessage());
    System.out.println("C) " + two.getCause().getMessage());

    System.out.println();

    Exception three = new Exception("my message", one);
    System.out.println("D) " + three.getMessage());
    System.out.println("E) " + three.getCause().getMessage());

    System.out.println();

    Exception fourth = new Exception(null, one);
    System.out.println("F) " + fourth.getMessage());
    System.out.println("G) " + fourth.getCause().getMessage());
}

出力はこれです

A) my cause

B) java.lang.Exception: my cause
C) my cause

D) my message
E) my cause

F) null
G) my cause

との違いをB見るF

Bどちらの場合もメッセージを提供しませんでしたが、違いはnull値が強制されないことです。

メッセージが指定されていBない場合、getMessage()メソッドはフォーマットを提供するようです が、値className: cause.getMessage() を持つことを除いて(ケースのように)。nullF

のみを提供し、 を提供せずに作成された例外でを呼び出す場合、null値 ( のような)を取得する方法はありますか?FgetMessagecausemessage

4

3 に答える 3

3

Exceptionの JavaDocを見てください。のみを取るコンストラクタの場合Throwable:

指定された原因と の詳細メッセージ(cause==null ? null : cause.toString())(通常は のクラスと詳細メッセージを含むcause) を持つ新しい例外を構築します。このコンストラクターは、他のスロー可能オブジェクト (たとえば、PrivilegedActionException) のラッパーにすぎない例外に役立ちます。

したがって、B のケースでは、原因が null ではないためcause.toString()、コンテナー例外のメッセージとして の値を取得します。

そのコンストラクターが例外の作成に使用された場合、例外をキャッチするまでには手遅れです。上記の詳細メッセージが既に含まれています。詳細メッセージが null ではないため、「null」を取得できません。それを原因のメッセージと比較して、toString()null である必要があると推測できますが、それは大雑把であり、理論的には、原因のメッセージは時間の経過とともに変化し、キャッチ時に異なる可能性があります。

于 2017-06-01T08:02:48.043 に答える
0

@RealSkeptic の返信に基づいて、このようなメソッドを作成しました

public static String getMessageOrNull(Throwable t) {
    String message = t.getMessage();

    if (t.getCause() != null && message.equals(t.getCause().toString())) {
        message = null;
    }

    return message;
}

それは最善のアプローチではないかもしれませんが、私の場合はうまくいきます。

于 2017-06-01T10:06:59.923 に答える