おそらく初心者の質問ですが、誰もがe.printStackTrace()
を使用しているようですが、例外処理には常にSystem.out.println(e)
を使用しています。違いは何ですか?e.printStackTrace()
が望ましいのはなぜですか?
使用される出力ストリームは@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");
}
_System.out.println
_を使用すると、エラーはstdout
ではなくstderr
にダンプされます。
エラーを標準エラーにダンプするのが伝統的であるため、エラー出力から正常に成功した出力をフィルタリングできます。これはコマンドラインユーティリティの一般的な慣習であり、従うことをお勧めします。
例えば.
_myCommand 2> /tmp/errors > /tmp/results
_
エラーを1つのログに書き込み、結果を別のログに書き込みます。シェル/呼び出しプロセスなどに応じて、この情報を組み合わせたり、エラーを破棄したり、エラーが発生した場合に対応したりできます。詳細については、 here を参照してください。
printStackTrace()
を使用することは、例外が発生した場所をダンプするため、良いアイデアです。これは、予期しないエラーを追跡する場合に非常に貴重なことがよくあります。これは、エラーが発生した正確な場所への直接(詳細な場合)ポインターを提供するためです。
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の結果の配列を出力する独自のルーチンを作成する必要はありません。
System.out.println(e)
は、スタックトレースではなく、エラーメッセージと例外タイプのみを提供し、エラー出力ではなく標準出力に出力します。
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);
}
これにより、ログファイル(ある場合)およびコンソールでエラーを確認できます。
ベロープログラムは差分の詳細を表示
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();
}
}
}