1632

Throwable.getStackTrace()結果をスタックトレースを表す文字列に変換する最も簡単な方法は何ですか?

4

31 に答える 31

2312

Throwable.printStackTrace(PrintWriter pw)スタック トレースを適切なライターに送信するために使用します。

import java.io.StringWriter;
import java.io.PrintWriter;

// ...

StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); // stack trace as a string
System.out.println(sStackTrace);
于 2009-07-19T11:36:22.867 に答える
1103

Exception次のメソッドを使用して、スタック トレースをに変換できますString。このクラスは、多くの一般的なオープン ソースで最も一般的な依存ライブラリである Apache commons-lang で利用できます。

org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)

于 2010-01-21T14:39:54.360 に答える
488

これはうまくいくはずです:

StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
于 2009-07-19T11:41:22.950 に答える
256

Android 向けに開発している場合、はるかに簡単な方法はこれを使用することです。

import android.util.Log;

String stackTrace = Log.getStackTraceString(exception); 

フォーマットは getStacktrace と同じです。

09-24 16:09:07.042: I/System.out(4844): java.lang.NullPointerException
09-24 16:09:07.042: I/System.out(4844):   at com.temp.ttscancel.MainActivity.onCreate(MainActivity.java:43)
09-24 16:09:07.042: I/System.out(4844):   at android.app.Activity.performCreate(Activity.java:5248)
09-24 16:09:07.043: I/System.out(4844):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.access$800(ActivityThread.java:139)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Handler.dispatchMessage(Handler.java:102)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Looper.loop(Looper.java:136)
09-24 16:09:07.044: I/System.out(4844):   at android.app.ActivityThread.main(ActivityThread.java:5097)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invokeNative(Native Method)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invoke(Method.java:515)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
于 2012-04-30T07:29:32.897 に答える
117

警告: 原因は含まれていません (通常はこれが役に立ちます!)

public String stackTraceToString(Throwable e) {
    StringBuilder sb = new StringBuilder();
    for (StackTraceElement element : e.getStackTrace()) {
        sb.append(element.toString());
        sb.append("\n");
    }
    return sb.toString();
}
于 2009-07-19T11:38:56.560 に答える
106

私にとって最もクリーンで簡単な方法は次のとおりです。

import java.util.Arrays;
Arrays.toString(e.getStackTrace());
于 2011-12-15T14:37:34.547 に答える
30
public static String getStackTrace(Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}
于 2013-10-03T19:15:57.643 に答える
26

次のコードStringを使用すると、log4J などの API やjava.util.Logger.

catch (Exception e) {
    StackTraceElement[] stack = e.getStackTrace();
    String exception = "";
    for (StackTraceElement s : stack) {
        exception = exception + s.toString() + "\n\t\t";
    }
    System.out.println(exception);
    // then you can send the exception string to a external file.
}
于 2012-10-24T16:57:43.100 に答える
20

コードに直接コピーして貼り付けることができるバージョンを次に示します。

import java.io.StringWriter; 
import java.io.PrintWriter;

//Two lines of code to get the exception into a StringWriter
StringWriter sw = new StringWriter();
new Throwable().printStackTrace(new PrintWriter(sw));

//And to actually print it
logger.info("Current stack trace is:\n" + sw.toString());

または、catch ブロックで

} catch (Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    logger.info("Current stack trace is:\n" + sw.toString());
}
于 2012-06-12T16:15:22.197 に答える
12

スタック トレースを文字列に出力する

import java.io.PrintWriter;
import java.io.StringWriter;

public class StackTraceUtils {
    public static String stackTraceToString(StackTraceElement[] stackTrace) {
        StringWriter sw = new StringWriter();
        printStackTrace(stackTrace, new PrintWriter(sw));
        return sw.toString();
    }
    public static void printStackTrace(StackTraceElement[] stackTrace, PrintWriter pw) {
        for(StackTraceElement stackTraceEl : stackTrace) {
            pw.println(stackTraceEl);
        }
    }
}

-のインスタンスを作成せずに現在のスレッド スタック トレースを出力したい場合に便利ですが、実際には を呼び出すよりもThrowable新しく作成してそこからスタック トレースを取得する方が高速で安価であることに注意してください。ThrowableThread.getStackTrace

于 2011-05-11T18:40:57.297 に答える
5

例外の原因も含まれるガラの回答の拡張:

private String extrapolateStackTrace(Exception ex) {
    Throwable e = ex;
    String trace = e.toString() + "\n";
    for (StackTraceElement e1 : e.getStackTrace()) {
        trace += "\t at " + e1.toString() + "\n";
    }
    while (e.getCause() != null) {
        e = e.getCause();
        trace += "Cause by: " + e.toString() + "\n";
        for (StackTraceElement e1 : e.getStackTrace()) {
            trace += "\t at " + e1.toString() + "\n";
        }
    }
    return trace;
}
于 2016-07-15T10:11:49.383 に答える
4

解決策は、配列の stackTrace を文字列データ型に変換することです。次の例を参照してください。

import java.util.Arrays;

try{

}catch(Exception ex){
    String stack = Arrays.toString(ex.getStackTrace());
    System.out.println("stack "+ stack);
}
于 2018-03-30T18:39:12.160 に答える