Что такое трассировка стека Java?
Хотя на первый взгляд это может показаться запутанным, трассировка стека может стать ключом к быстрому и эффективному устранению неполадок.
Трассировка стека (или обратная трассировка) — это выходные данные, показывающие стек методов вашего приложения. Обычно вы увидите его на своем терминале, когда ваше приложение обнаружит ошибку.
Как следует из названия, структура данных стека хранит методы в трассировке стека. Метод, с которого начинается выполнение программы, находится внизу стека, а метод, создающий трассировку стека, — вверху.
Трассировка стека может быть очень полезна при отладке кода.
Почему важна трассировка стека?
Трассировка стека — важный инструмент отладки. Он предоставляет вам подробную информацию, такую как тип ошибки, метод, в котором она произошла, строка вашего кода, в которой она произошла, и путь к файлу.
Для опытного программиста эта информация — золотая жила, позволяющая понять, что именно и где пошло не так.
Как программист, вы также можете попросить свою программу создать трассировку стека по требованию. Это может быть особенно полезно для обслуживания кода и устранения неполадок.
Как вывести трассировку стека
В зависимости от версии компилятора вы, скорее всего, получите читаемую обратную трассировку. Читабельная обратная трассировка предоставляет удобный для пользователя текст об ошибке, в отличие от обычной обратной трассировки. Это особенно актуально для новых компиляторов. Поэтому лучший способ узнать о трассировках стека — создать их самостоятельно.
Вы можете создать трассировку стека, не допуская ошибок в коде. Для этого просто используйте метод dumpStack класса java.lang.Thread. Он покажет все вызванные методы, начиная с того, который вызывает dumpStack. Вызывающий метод будет находиться на вершине структуры данных стека.
Вот пример программы, которая явно генерирует трассировку стека:
class StackTraceDemo {
public static void main(String[] args) {
day();
}
static void day() {
hours();
}
static void hours() {
minutes();
}
static void minutes() {
int a = 24 * 60;
System.out.println(a + " minutes in a day");
Thread.dumpStack();
}
}
Выход :
1440 minutes in a day
java.lang.Exception: Stack trace
at java.base/java.lang.Thread.dumpStack(Thread.java:138)
at StackTraceDemo.minutes(StackTraceDemo.java:17)
at StackTraceDemo.hours(StackTraceDemo.java:11)
at StackTraceDemo.day(StackTraceDemo.java:7)
at StackTraceDemo.main(StackTraceDemo.java:3)
В этом выводе вы можете заметить, что обратная трассировка показывает, как программа вызывала каждый метод Java и по какому номеру строки в своем исходном коде. Метод, сгенерировавший трассировку стека, показан в верхней части стека. Метод, вызвавший этот метод, находится на строке под ним и так далее.
За пределами трассировки стека
По умолчанию, когда ваша Java-программа сталкивается с ошибкой, она останавливается и отображает трассировку стека. Однако вы можете корректно обрабатывать эти ошибки вместо отображения сообщений, которые могут сбить с толку конечных пользователей.
Вы можете улучшить обработку ошибок в вашей программе, используя блок try...catch() для перехвата исключений. Также важно учитывать и понимать различные типы ошибок, с которыми могут столкнуться ваши программы.