おそらく初心者の質問ですが、誰もが を使用しているようですが、例外処理の場合e.printStackTrace()は常に使用しています。System.out.println(e)違いは何ですか?なぜe.printStackTrace()好ましいのですか?
7 に答える
使用される出力ストリームは、@ Brianが指摘したものと同じではありませんが、詳細レベルも同じではありません。以下の簡単なテストで試すことができます。出力:
printlnあり:どの例外がスローされたかしかわかりません
java.lang.UnsupportedOperationException:まだ実装されていません
でprintStackTrace:あなたはそれを引き起こした原因も知っています(行番号+コールスタック)
java.lang.UnsupportedOperationException:
javaapplication27.Test1.main(Test1.java:19)
のjavaapplication27.Test1.test (Test1.java:27)ではまだ実装されていません
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にダンプされます。stdoutstderr
エラーを標準エラーにダンプするのは伝統的であるため、エラー出力から通常の成功した出力をフィルタリングできます。これは、コマンドライン ユーティリティの一般的な方法であり、従うことをお勧めします。
例えば
myCommand 2> /tmp/errors > /tmp/results
エラーを 1 つのログに書き込み、結果を別のログに書き込みます。シェル/呼び出しプロセスなどに応じて、この情報を組み合わせたり、エラーをスローしたり、エラーがスローされた場合に反応したりできます。詳細については、こちらを参照してください。
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 ではない) に書き込み、スタック トレース (つまり、例外の原因となった一連のメソッド) にも書き込みます。これは有益な情報です。
が出力する情報を含む文字列を返すメソッドがあればいいのにとよく思いますe.printStackTrace()。e.getStackTrace()StackTraceElements の結果の配列を出力するために、独自のルーチンを使用および作成する必要がないためです。
の出力は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)エラーメッセージと例外タイプだけでなく、エラー出力ではなく標準出力に出力されるだけでなく、スタックトレースは表示されません。
怒鳴るプログラムは違いの詳細を表示します
System.out.println(e); :- 例外のみを表示します。egjava.lang.ArithmeticException: / by zero e.printStackTrace(); :- 例外の詳細とプログラム内で例外が発生する場所を行番号で表示します。例: java.lang.ArithmeticException: / by zero at test.Test.main(Test.java:7)
package test;
public class Test {
public static void main(String args[]) {
try {
System.out.println(12 / 0);
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
}