web-dev-qa-db-ja.com

e.printStackTraceとSystem.out.println(e)の違い

おそらく初心者の質問ですが、誰もがe.printStackTrace()を使用しているようですが、例外処理には常にSystem.out.println(e)を使用しています。違いは何ですか?e.printStackTrace()が望ましいのはなぜですか?

27
imulsion

使用される出力ストリームは@Brianが指摘したものと同じではありませんが、詳細レベルも同じではありません-以下の簡単なテストで試すことができます。出力:

printlnを使用すると、どの例外がスローされたかのみがわかります。

Java.lang.UnsupportedOperationException:まだ実装されていません

printStackTraceを使用すると、何が原因かがわかります(行番号+呼び出しスタック)

Java.lang.UnsupportedOperationException:まだ実装されていません
at javaapplication27.Test1.test(Test1.Java:27)
javaapplication27.Test1.main(Test1.Java:19)

public static void main(String[] args){
    try {
        test();
    } catch (UnsupportedOperationException e) {
        System.out.println(e);
        e.printStackTrace();
    }
}

private static void test() {
    throw new UnsupportedOperationException("Not yet implemented");
}
37
assylias

_System.out.println_を使用すると、エラーはstdoutではなくstderrにダンプされます。

エラーを標準エラーにダンプするのが伝統的であるため、エラー出力から正常に成功した出力をフィルタリングできます。これはコマンドラインユーティリティの一般的な慣習であり、従うことをお勧めします。

例えば.

_myCommand 2> /tmp/errors > /tmp/results
_

エラーを1つのログに書き込み、結果を別のログに書き込みます。シェル/呼び出しプロセスなどに応じて、この情報を組み合わせたり、エラーを破棄したり、エラーが発生した場合に対応したりできます。詳細については、 here を参照してください。

printStackTrace()を使用することは、例外が発生した場所をダンプするため、良いアイデアです。これは、予期しないエラーを追跡する場合に非常に貴重なことがよくあります。これは、エラーが発生した正確な場所への直接(詳細な場合)ポインターを提供するためです。

7
Brian Agnew

System.out.println(e)System.out.println(e.toString())と同等です:_System.out_はPrintStream、PrintStream.println(Object o)PrintStream.println(o.toString())を呼び出します。

e.toString()は、クラスの名前と例外のgetLocalizedMessage()を返します。

e.printStackTrace()は、その情報をSystem.err(System.outではなく)およびalsoスタックトレース、つまり、例外につながったメソッドのチェーンに書き込みます。これは有用な情報です。

e.printStackTrace()によって出力される情報を含むStringを返すメソッドがあれば、それはいいと思っていました。 e.getStackTrace()を使用してStackTraceElementsの結果の配列を出力する独自のルーチンを作成する必要はありません。

4
slim

System.out.println(e)は、スタックトレースではなく、エラーメッセージと例外タイプのみを提供し、エラー出力ではなく標準出力に出力します。

1
tofarr

e.printStackTrace();の出力はSystem.errそして、通常、アプリのログをファイルに出力します。両方を使用することをお勧めしますSystem.errおよびSystem.outエラーを出力します。

public static void log(Exception e) {
    e.printStackTrace(); // This goes to System.err
    e.printStackTrace(System.out);
}

これにより、ログファイル(ある場合)およびコンソールでエラーを確認できます。

1

ベロープログラムは差分の詳細を表示

System.out.println(e);:-例外のみを表示します。例:Java.lang.ArithmeticException:/ by zero e.printStackTrace();:-例外の詳細と、行番号のあるプログラムで例外を発生させる場所を示します。 Java.lang.ArithmeticException:/ test.Test.main(Test.Java:7)でゼロによる

パッケージテスト;

パブリッククラスTest {

public static void main(String args[]) {
    try {
        System.out.println(12 / 0);

    } catch (Exception e) {
        System.out.println(e);
        e.printStackTrace();
    }

}

}

0
MAnoj Sarnaik