1

getCauseの関数を呼び出しているときに null を取得していますThrowable

package com.salman.demo;
public class MyClass {
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            NormalClass.testIt();
        } catch (Throwable th) {
            System.out.println(th.getCause());
        }
    }
}


package com.salman.demo;

import com.salman.exceptions.ValidationException;

public class NormalClass {
    public static void testIt() throws ValidationException {
        System.out.println("Inside testIt funtion.");

        throw new ValidationException("Validation Exception..");
    }
}

実行するMyClassと、次の出力が出力されます

Inside testIt funtion.
null

ただし、これをデバッグすると、プライベート変数が予期される値に設定されていることがわかりますがValidationException、そのプライベートフィールドのゲッターを呼び出すとnullが返されます。

4

2 に答える 2

3

ValidationExceptionあなたが投げたのはthあなたの呼び出しコードにあります...その理由はありValidationExceptionません。ポイントgetCause()は、ある例外が別の例外を根本的な原因として参照できるようにすることですが、あなたのケースには例外が1つしかありません。

causeプライベート変数の値が であることがわかるという事実は、ValidationExceptionそのフィールドが文書化されている方法と完全に一致しています (私の強調):

このスロー可能オブジェクトがスローされる原因となったスロー可能オブジェクト、またはスロー可能オブジェクトが別のスロー可能オブジェクトによって引き起こされたものではない場合、または原因となるスロー可能オブジェクトが不明な場合は null。このフィールドがこの throwable 自体と等しい場合、この throwable の原因がまだ初期化されていないことを示します。

そのため、次のgetCause()ように実装されています。

return (cause==this ? null : cause);

意図した連鎖が実際に行われていることを確認したい場合は、2 つの例外を作成し、一方が他方に連鎖するようにすることができます。

throw new ValidationException("Validation Exception..",
    new IllegalArgumentException("Bang!"));

を呼び出すgetCause()と、ValidationExceptionが返されIllegalArgumentExceptionます。

thおそらく、代わりにログに記録するように呼び出しコードを変更したいだけでしょうth.getCause()

于 2015-02-26T13:20:00.990 に答える
2

あなたの例外はチェーンの最初のものなので、原因はありません。

テストしたい場合は、例外のチェーンが必要なので、それをキャッチして、前のものを使用して構築された新しいものをスローします。

于 2015-02-26T13:20:24.413 に答える