Was ist die Verwendung der printStackTrace () -Methode in Java?

97

Ich mache gerade ein Socket-Programm durch. Darin printStackTracewird das IOExceptionObjekt im catch-Block aufgerufen .
Was macht printStackTrace()eigentlich?

catch(IOException ioe)
{
    ioe.printStackTrace();
}

Ich bin mir seines Zwecks nicht bewusst. Was wird es verwendet?

Venkat
quelle
47
Eine der leistungsstärksten Funktionen in modernen IDEs ist die Möglichkeit, die Dokumentation (Javadoc genannt) für eine bestimmte Java-Methode nachzuschlagen. In Eclipse ist es Umschalt-F2, wenn der Cursor auf den Namen der printStackTrace-Methode gesetzt wird.
Thorbjørn Ravn Andersen
2
Klingt so, als wären Sie neu in Java. Hier ist etwas zu lesen: today.java.net/article/2006/04/04/…
TJR
Sie können auch den Code von printStackTrace () lesen, um genau zu sehen, was es tut und wie es es tut.
Peter Lawrey
1
Ich sehe dieses Muster oft in Fangblöcken: e.printStackTrace(); System.exit(1); Hier möchte ich die gleiche Frage stellen wie das OP, aber in einem anderen Sinne: Was genau ist der Zweck davon? Wird die JRE die Stapelverfolgung nicht automatisch drucken und beenden, wenn die Ausnahme ausgelöst wird? Dh hier ist nicht wirklich viel "Exception Handling" los, oder?
Owen
1
Dies ist im Allgemeinen auch eine sehr schlechte Idee , da sie die Ausnahme unterdrückt. Leider wird dies von Eclipse und anderen IDEs häufig automatisch als Body für den Catch-Block vorgeschlagen, sodass es weitaus häufiger verwendet wird, als es sein sollte.
dimo414

Antworten:

99

Es ist eine Methode für ExceptionInstanzen, die den Stack-Trace der Instanz drucktSystem.err .

Es ist ein sehr einfaches, aber sehr nützliches Werkzeug zur Diagnose von Ausnahmen. Es zeigt Ihnen, was passiert ist und wo im Code dies passiert ist.

Hier ist ein Beispiel, wie es in der Praxis verwendet werden könnte:

try {
    // ...
} catch (SomeException e) { 
    e.printStackTrace();
}
Joachim Sauer
quelle
2
Und dank überprüfter Ausnahmen ist es wahrscheinlich der Hauptinhalt von catchBlöcken :-)
Joey
3
@ Joey Orthrow new RuntimeException(e)
Bart van Heukelom
3
Es wird jedoch als schlechte Praxis angesehen, da es nicht threadsicher ist. Verwenden Sie die Logger-Anweisung und fügen Sie sie dort ein.
Karidrgn
40

Ich war auch ein bisschen neugierig, also habe ich einfach einen kleinen Beispielcode zusammengestellt, in dem Sie sehen können, was er tut:

try {
    throw new NullPointerException();
}
catch (NullPointerException e) {
    System.out.println(e);
}

try {
    throw new IOException();
}
catch (IOException e) {
    e.printStackTrace();
}
System.exit(0);

Anrufen println(e):

java.lang.NullPointerException

Anrufen e.printStackTrace():

java.io.IOException
      at package.Test.main(Test.java:74)
Jens Bodal
quelle
Dies ist normal. Beim ersten Aufruf rufen Sie den toString () des Fehlers auf, und beim zweiten werden Sie aufgefordert, den gesamten stackTrace aus dem Fehler auszudrucken. Das sind zwei verschiedene Dinge.
Jon
1
System.err.println(e);wird angemessener sein.
Roottraveller
14

Es hilft, die Ausnahme zu verfolgen. Zum Beispiel schreiben Sie einige Methoden in Ihr Programm und eine Ihrer Methoden verursacht Fehler. Dann hilft Ihnen printstack zu identifizieren, welche Methode den Fehler verursacht. Stack hilft dabei:

Zuerst wird Ihre Hauptmethode aufgerufen und in den Stapel eingefügt, dann wird die zweite Methode aufgerufen und in der LIFO-Reihenfolge in den Stapel eingefügt. Wenn irgendwo in einer Methode ein Fehler auftritt, hilft dieser Stapel, diese Methode zu identifizieren.

Yogesh Pathak
quelle
11

printStackTrace()hilft dem Programmierer zu verstehen, wo das eigentliche Problem aufgetreten ist. printStacktrace()ist eine Methode Throwableder java.langPaketklasse. Es werden mehrere Zeilen in der Ausgabekonsole gedruckt. Die erste Zeile besteht aus mehreren Zeichenfolgen. Es enthält den Namen der Throwable-Unterklasse und die Paketinformationen. Ab der zweiten Zeile wird die Fehlerposition / Zeilennummer beginnend mit beschrieben at.

Die letzte Zeile beschreibt immer das Ziel, das von dem Fehler / der Ausnahme betroffen ist. Die vorletzte Zeile informiert uns über die nächste Zeile im Stapel, in die das Steuerelement geht, nachdem die Übertragung von der in der letzten Zeile beschriebenen Zeilennummer erfolgt ist. Die Fehler / Ausnahmen stellt die Ausgabe in Form eines Stapels, die in den Stapel durch gefüttert wurden fillInStackTrace()Methode der ThrowableKlasse, die sich in der Programmsteuertransferdaten in den Ausführungsstapel füllt. Die Zeilen, die mit beginnen at, sind nichts anderes als die Werte des Ausführungsstapels. Auf diese Weise kann der Programmierer verstehen, wo im Code das eigentliche Problem liegt.

Zusammen mit der printStackTrace()Methode ist es eine gute Idee, zu verwenden e.getmessage().

Ashish Gope
quelle
6

printStackTrace()Gibt die Stellen aus, an denen die Ausnahme im Quellcode aufgetreten ist, sodass der Autor, der das Programm geschrieben hat, sehen kann, was schief gelaufen ist. Da es jedoch Probleme im Quellcode gibt, können die Benutzer, die möglicherweise keine Codierungserfahrung haben oder nicht, möglicherweise nicht verstehen, was schief gelaufen ist. Wenn das Programm es dem Benutzer ermöglicht, Fehlermeldungen an die Autoren zu senden, können die Benutzer sind möglicherweise nicht in der Lage, gute Daten darüber zu geben, was schief gelaufen ist.

Sie sollten die Logger.getLogger()Methode in Betracht ziehen , sie bietet eine bessere Möglichkeit zur Ausnahmebehandlung (Protokollierung) und gilt außerdem printStackTrace()ohne Argumente als veraltet und sollte NUR für Debugging-Zwecke verwendet werden, nicht für die Benutzeranzeige.

TheArchon
quelle
2

Das printStackTrace()hilft dem Programmierer zu verstehen , wo das eigentliche Problem aufgetreten ist . Die printStackTrace()Methode ist Mitglied der Klasse Throwableim java.langPaket.

Rasmi Ranja Choudhury
quelle
2

printStackTraceist eine Methode der ThrowableKlasse. Diese Methode zeigt eine Fehlermeldung in der Konsole an. wo wir die Ausnahme im Quellcode bekommen. Diese Methoden können mit catch block verwendet werden und beschreiben:

  1. Name der Ausnahme.
  2. Beschreibung der Ausnahme.
  3. Position der Ausnahme im Quellcode.

Die drei Methoden, die die Ausnahme auf der Konsole beschreiben (in der printStackTrace eine davon ist), sind:

  1. printStackTrace()
  2. toString()
  3. getMessage()

Beispiel:

public class BabluGope {
    public static void main(String[] args) {
        try {
            System.out.println(10/0);
         } catch (ArithmeticException e) {
             e.printStackTrace();   
             // System.err.println(e.toString());
             //System.err.println(e.getMessage());  
         }
    }
}
Bablu Mgc
quelle
1

printStackTrace () hilft dem Programmierer zu verstehen, wo das eigentliche Problem aufgetreten ist. Es hilft, die Ausnahme zu verfolgen. Es ist die printStackTrace () -Methode der Throwable-Klasse, die von jeder Ausnahmeklasse geerbt wird. Diese Methode druckt dieselbe Nachricht des e-Objekts und auch die Zeilennummer, in der die Ausnahme aufgetreten ist.

Das Folgende ist ein weiteres Beispiel für den Druckstapel der Ausnahme in Java.

public class Demo {
   public static void main(String[] args) {
      try {
         ExceptionFunc();
      } catch(Throwable e) {
         e.printStackTrace();
      }
   }
   public static void ExceptionFunc() throws Throwable {
      Throwable t = new Throwable("This is new Exception in Java...");

      StackTraceElement[] trace = new StackTraceElement[] {
         new StackTraceElement("ClassName","methodName","fileName",5)
      };
      t.setStackTrace(trace);
      throw t;
   }
}

java.lang.Throwable: Dies ist eine neue Ausnahme in Java ... unter ClassName.methodName (fileName: 5)

RohanMNirer
quelle
0

Was ist die Verwendung der e.printStackTrace () -Methode in Java?

Nun, der Zweck dieser Methode e.printStackTrace();ist es, herauszufinden, was genau falsch ist.

Zum Beispiel möchten wir eine Ausnahme behandeln. Schauen wir uns das folgende Beispiel an.

public class Main{

  public static void main(String[] args) {

    int a = 12;
    int b = 2;

    try {
       int result = a / (b - 2);
       System.out.println(result);
    }

    catch (Exception e)
    {
       System.out.println("Error: " + e.getMessage());
       e.printStackTrace();
    }
  }
}

Ich habe eine Methode e.printStackTrace();verwendet, um genau zu zeigen, was falsch ist.

In der Ausgabe sehen wir das folgende Ergebnis.

Error: / by zero

java.lang.ArithmeticException: / by zero

  at Main.main(Main.java:10)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Stephen Rauch
quelle
-1

Siehe Bild hier

printStackTrace() Gibt an, in welcher Zeile Sie einen Fehler erhalten und warum Sie einen Fehler erhalten.

Beispiel:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
SS Tiwari
quelle