it-swarm.com.de

Unterschied zwischen printStackTrace () und toString ()

Ich bin gespannt, was der Unterschied zwischen printStackTrace () und toString () ist. Auf den ersten Blick scheinen sie genau dasselbe zu tun.

Code:

try {
// Some code
} catch (Exception e)
   e.printStackTrace();
   // OR
   e.toString()
}
51
Andreas

Nein, es gibt einen wichtigen Unterschied! Mit toString haben Sie nur den Typ der Ausnahme und die Fehlernachricht. Mit printStackTrace () erhalten Sie den gesamten Stacktrace einer Ausnahme, was sehr hilfreich beim Debuggen ist.

Beispiel für System.out.println (toString ()):

Java.io.FileNotFoundException: yourFile.txt (The system cannot find the file specified)

Beispiel für printStackTrace ():

Java.io.FileNotFoundException: yourFile.txt (The system cannot find the file specified)
at Java.io.FileInputStream.open(Native Method)
at Java.io.FileInputStream.(FileInputStream.Java:106)
at Java.io.FileReader.(FileReader.Java:55)
at ReadFromFile.main(ReadFromFile.Java:14)

Um aus dem gesamten Stacktrace eine Zeichenfolge zu erstellen, verwende ich normalerweise diese Methode:

public static String exceptionStacktraceToString(Exception e)
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PrintStream ps = new PrintStream(baos);
    e.printStackTrace(ps);
    ps.close();
    return baos.toString();
}

Beachten Sie auch, dass der einfache Aufruf von toString() einfach eine Zeichenfolge zurückgibt und nichts ausdrucken wird.

80

Um StackTrace in String zu konvertieren, verwende ich eine kürzere Implementierung:

public static String exceptionStacktraceToString(Exception e)
{
    return Arrays.toString(e.getStackTrace());
}
53
RenaudBlue

Nein, es gibt einen großen Unterschied. Wenn Sie nurtoString aufrufen, wird nichts drucken - es wird nur eine Zeichenfolge zurückgegeben. Ein catch-Block von nur e.toString(); ist nutzlos. (Es gibt auch die Angelegenheit der Stack-Spur, wie Martijn darauf hinwies.)

Persönlich würde ich auch nicht verwenden - ich würde eine Protokollierungsbibliothek (log4j, Java.util.logging usw.) verwenden, die die Throwable selbst als Parameter verwendet und sie sinnvoll formatiert - einschließlich der Stack-Ablaufverfolgung, die zur Vermeidung möglicherweise gekürzt wird Wiederholung.

12
Jon Skeet

toString () gibt den Namen der Ausnahmeklasse an, wenn eine Ausnahme ausgelöst wird, und printStackTrace () gibt die Eintragshierarchie der Methodenausführung an, die vorhanden war, als eine Ausnahme in der Anwendung ausgelöst wurde.

Für den Code

    try 
    {
        List<String>  n =new ArrayList<String>();
        String i = n.get(3); 
    }catch (Exception e) {
        e.printStackTrace();
    }
   }

e.printStackTrace() wird geben 

Java.lang.IndexOutOfBoundsException: Index: 3, Size: 0
    at Java.util.ArrayList.RangeCheck(ArrayList.Java:547)
    at Java.util.ArrayList.get(ArrayList.Java:322)
    at com.o2.business.util.Trial.test(CommonUtilsTest.Java:866)

Während e.toString() nichts druckt, wie Jon in seiner Antwort schrieb.

1
vikiiii

Ich denke, dass Sie die Ausgabe von Throwable.printStackTrace() erhalten möchten, genau wie ich es gesucht habe. Ich überprüfte den Java-Quellcode und stellte eine String zusammen, anstatt in eine PrintStream zu schreiben. Es ist etwas umfassender als die @ MartijnCourteaux-Lösung, fühlt sich aber für mich wie ein Hacker an.

Was Ihre Antwort betrifft, können Sie tatsächlich sehen, dass Throwable.toString() nur ein Teil von Throwable.printStackTrace() ist:

public static String getStackTraceString(Throwable e) {
    return getStackTraceString(e, "");
}

private static String getStackTraceString(Throwable e, String indent) {
    StringBuilder sb = new StringBuilder();
    sb.append(e.toString());
    sb.append("\n");

    StackTraceElement[] stack = e.getStackTrace();
    if (stack != null) {
        for (StackTraceElement stackTraceElement : stack) {
            sb.append(indent);
            sb.append("\tat ");
            sb.append(stackTraceElement.toString());
            sb.append("\n");
        }
    }

    Throwable[] suppressedExceptions = e.getSuppressed();
    // Print suppressed exceptions indented one level deeper.
    if (suppressedExceptions != null) {
        for (Throwable throwable : suppressedExceptions) {
            sb.append(indent);
            sb.append("\tSuppressed: ");
            sb.append(getStackTraceString(throwable, indent + "\t"));
        }
    }

    Throwable cause = e.getCause();
    if (cause != null) {
        sb.append(indent);
        sb.append("Caused by: ");
        sb.append(getStackTraceString(cause, indent));
    }

    return sb.toString();
}
1
Kapé

Es gibt eine Open-Source-Java-Bibliothek namens MgntUtils (von mir geschrieben), die mehrere Methoden bietet, mit denen Sie Stacktrace als String extrahieren und optional basierend auf dem parametrischen Paketpräfix filtern können. Die Methode public static Java.lang.String getStacktrace (Java.lang.Throwable e, Boolean cutTBS, Java.lang.String relevantPackage)Maven Central und Github

0
Michael Gantman

dies ist was ich für die vollständige Stack-Trace als String verwende.

public static @NotNull String toString(@NotNull Throwable e) {
    StringWriter sw = new StringWriter();
    e.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}
0
ycomp