64

printStackTrace()とtoString()の違いについて知りたいです。一見すると、彼らはまったく同じことをしているように見えます。

コード:

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

7 に答える 7

97

いいえ、重要な違いがあります!toStringを使用すると、例外のタイプとエラーメッセージのみが表示されます。printStackTrace()を使用すると、例外のスタックトレース全体を取得できます。これは、デバッグに非常に役立ちます。

System.out.println(toString())の例:

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

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)

スタックトレース全体の文字列を作成するには、通常、次の方法を使用します。

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

toString()また、単に呼び出すだけで文字列が返され、何も出力されないことに注意してください。

于 2012-04-12T09:16:26.767 に答える
62

StackTraceをStringに変換するために使用する短い実装は、次のとおりです。

public static String exceptionStacktraceToString(Exception e)
{
    return Arrays.toString(e.getStackTrace());
}
于 2012-04-13T08:24:14.890 に答える
14

いいえ、大きな違いがあります。を呼び出すだけtoStringでは、何も出力されません。文字列が返されるだけです。ちょうどのキャッチブロックe.toString();は役に立たない。(Martijnが指摘したように、スタックトレースの問題もあります。)

個人的にはどちらも使用しませんが、ログライブラリ(log4j、java.util.loggingなど)を使用します。このライブラリは、Throwableそれ自体をパラメータとして受け取り、それを便利にフォーマットします。スタックトレースを含め、繰り返しを避けるために切り捨てられる可能性があります。 。

于 2012-04-12T09:17:49.897 に答える
1

toString ()例外が発生したときに例外クラスの名前をprintStackTrace ()示し、アプリケーションで例外が発生したときに存在したメソッド実行のエントリ階層を示します。

コードの場合

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

e.printStackTrace()あげる

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)

e.toString()ジョンが彼の答えに書いたように何も印刷しませんが。

于 2012-04-12T09:18:14.160 に答える
1

Throwable.printStackTrace()私が探していたのと同じように、の出力を取得したいと思います。StringJavaのソースコードをチェックして、に書き込む代わりにまとめましたPrintStream。@MartijnCourteauxソリューションよりもいくらか包括的ですが、私にとってはハックのように感じます。

あなたの答えに関しては、あなたは実際にそれThrowable.toString()がほんの一部であることがわかりますThrowable.printStackTrace()

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();
}
于 2014-09-13T00:15:09.327 に答える
1

これは、フルスタックトレースに使用するものです。String

public static @NotNull String toString(@NotNull Throwable e) {
    StringWriter sw = new StringWriter();
    e.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}
于 2017-02-24T02:51:01.317 に答える
0

MgntUtils(私が書いた)と呼ばれるオープンソースのJavaライブラリがあり、スタックトレースを文字列として抽出したり、オプションでパラメトリックパッケージプレフィックスに基づいてフィルタリングしたりできるいくつかのメソッドを提供します。メソッドについては、javadocを参照してください。publicstatic java.lang.String getStacktrace(java.lang.Throwable e、boolean cutTBS、java.lang.String relatedPackage) ライブラリはMavenCentralおよびGithubで入手できます

于 2018-08-20T11:05:41.787 に答える