Как преобразовать стек вызовов в строку?
Какой самый простой способ преобразовать результат Throwable.getStackTrace()
в строку, которая отображает стек вызовов?
5 ответ(ов)
Это должно сработать:
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
Данный код позволяет вам получить строковое представление стека исключения e
. Вы создаете экземпляр StringWriter
, который служит для записи данных в строку, а затем передаете его в PrintWriter
, чтобы вывести стек вызовов исключения. В результате, переменная exceptionAsString
будет содержать текстовое представление этого стека, которое вы можете использовать для логирования или отображения пользователю.
Если вы разрабатываете для 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)
Этот способ позволит вам легко получить трейс стека исключений в читабельном формате.
Вы используете метод stackTraceToString
, который извлекает стек вызовов из исключения Throwable
и возвращает его в виде строки. Однако стоит учитывать, что при этом метод не включает основную причину исключения, что обычно является наиболее полезной информацией при отладке.
Вот как можно изменить данный метод, чтобы он также учитывал причину исключения:
public String stackTraceToString(Throwable e) {
StringBuilder sb = new StringBuilder();
// Добавляем основное сообщение исключения
sb.append("Exception: ").append(e.getMessage()).append("\n");
// Добавляем стек вызовов
for (StackTraceElement element : e.getStackTrace()) {
sb.append(element.toString());
sb.append("\n");
}
// Если у исключения есть причина, добавляем ее
if (e.getCause() != null) {
sb.append("Caused by: ").append(e.getCause().getMessage()).append("\n");
for (StackTraceElement element : e.getCause().getStackTrace()) {
sb.append(element.toString());
sb.append("\n");
}
}
return sb.toString();
}
Этот измененный метод теперь будет возвращать информацию об исключении и его причине, что может быть полезно для анализа ошибок.
Для меня самый чистый и простой способ - это:
import java.util.Arrays;
Arrays.toString(e.getStackTrace());
Этот метод позволяет получить строковое представление стека вызовов исключения, что удобно для отладки и анализа ошибок.
Вот пример кода на Java, который позволяет получить стек вызовов (stack trace
) для исключения (Throwable
). Функция getStackTrace
принимает Throwable
в качестве параметра и возвращает строку, представляющую стек вызовов в виде текста.
public static String getStackTrace(Throwable t) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
В этом коде мы используем StringWriter
для записи вывода, который генерируется методом printStackTrace
у объекта Throwable
. Затем мы передаем этот StringWriter
в конструктор PrintWriter
для форматирования. В итоге, получаем строку с полным стеком вызовов, которую можно использовать для логгирования или отладки.
Инициализация ArrayList в одну строчку
Что значит "Не удалось найти или загрузить основной класс"?
Как установить Java 8 на Mac
Почему в RecyclerView отсутствует onItemClickListener()?
Что значит 'synchronized'?