web-dev-qa-db-de.com

Unterschied zwischen e.printStackTrace und System.out.println (e)

Wahrscheinlich eine Neulingfrage, aber jeder scheint e.printStackTrace() zu verwenden, aber ich habe bei der Ausnahmebehandlung immer System.out.println(e) verwendet. Was ist der Unterschied und warum ist e.printStackTrace() vorzuziehen?

27
imulsion

Der verwendete Ausgabestrom ist nicht derselbe, wie er von @Brian angegeben wurde, der Detaillierungsgrad ist jedoch auch nicht derselbe - Sie können den unten stehenden einfachen Test ausprobieren. Ausgabe:

Mit println: Sie wissen nur, welche Ausnahme ausgelöst wurde

Java.lang.UnsupportedOperationException: Noch nicht implementiert 

Mit printStackTrace: wissen Sie auch, was es verursacht hat (Zeilennummern + Aufrufstack)

Java.lang.UnsupportedOperationException: Noch nicht implementiert
bei javaapplication27.Test1.test (Test1.Java:27)
bei 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

Wenn Sie System.out.println verwenden, geben Sie Ihre Fehler in die stdout und nicht in stderr aus.

Es ist üblich, Fehler auf Standardfehler zu übertragen, sodass Sie eine normale Ausgabe anhand der Fehlerausgabe filtern können. Dies ist eine übliche Praxis für Befehlszeilenprogramme und daher eine gute Idee, die befolgt werden muss.

z.B.

myCommand 2> /tmp/errors > /tmp/results

schreibt Fehler in ein Protokoll und die Ergebnisse in ein anderes. Abhängig von Ihrer Shell/dem Aufrufprozess usw. können Sie diese Informationen kombinieren, Fehler wegwerfen, reagieren, wenn Fehler ausgegeben werden usw. Weitere Informationen finden Sie unter here .

Die Verwendung von printStackTrace() ist eine gute Idee, da Sie den Ort der Ausnahme ausgeben. Dies ist oft von unschätzbarem Wert für das Aufspüren von Fehlern, die unerwartet sind, da Sie einen direkten (wenn auch ausführlichen) Zeiger auf die genaue Stelle erhalten, an der Sie einen Fehler gefunden haben.

7
Brian Agnew

System.out.println(e) ist äquivalent zu System.out.println(e.toString()): System.out ist ein PrintStream, PrintStream.println(Object o) ruft PrintStream.println(o.toString()) auf.

e.toString() gibt den Namen der Klasse und getLocalizedMessage () der Ausnahme zurück.

e.printStackTrace() schreibt diese Informationen in System.err (nicht in System.out) und also in einen Stack-Trace, dh in die Kette von Methoden, die zu der Ausnahme geführt haben. Dies ist eine nützliche Information.

Ich habe oft gedacht, es wäre schön, wenn es eine Methode gibt, die einen String zurückgibt, der die von e.printStackTrace() ausgegebenen Informationen enthält. Da dies nicht der Fall ist, müssen Sie e.getStackTrace() verwenden und Ihre eigene Routine schreiben, um das resultierende Array von StackTraceElements auszugeben.

4
slim

System.out.println(e) gibt Ihnen nicht die Stack-Ablaufverfolgung, sondern nur die Fehlernachricht und den Ausnahmetyp sowie die Ausgabe an die Standardausgabe und nicht die Fehlerausgabe.

1
tofarr

Da die Ausgabe von e.printStackTrace();System.err ist und ich normalerweise mein App-Protokoll in einer Datei ausgeben, empfehle ich Ihnen, System.err und System.out zur Ausgabe von Fehlern zu verwenden.

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

Auf diese Weise können Sie die Fehler in der Protokolldatei (falls vorhanden) und in der Konsole anzeigen.

1
Toni Almeida

Bellow-Programm zeigt die Unterschiede Details

System.out.println (e); : - zeigt nur die Ausnahme . beispiel.java.lang.ArithmeticException:/durch null e.printStackTrace (); : - zeigt die Details der Ausnahme und wo um eine Ausnahme im Programm mit der Zeilennummer zu verursachen, z. Java.lang.ArithmeticException:/um null bei test.Test.main (Test.Java:7)

pakettest;

öffentliche Klasse 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