Что такое трассировка стека Java?

33
технологии 6.webp

Последнее обновление 03.01.2023 — Василий Иванов

Трассировка стека (или обратная трассировка) — это выходные данные, которые показывают стек методов вашего приложения. Обычно вы видите его на своем терминале, когда ваше приложение сталкивается с ошибкой.

Как следует из названия, структура данных стека хранит методы в трассировке стека. Метод, с которого начинается выполнение программы, находится внизу стека, а тот, который создает трассировку стека, — вверху.

Трассировка стека может быть очень полезна при отладке кода.

Почему важна трассировка стека?

Трассировка стека — важный инструмент отладки. Он дает вам подробную информацию, такую ​​как тип ошибки, метод, в котором она произошла, строка в вашем коде, где она произошла, и путь к файлу.

Для опытного программиста эта информация является золотой жилой для понимания того, что именно пошло не так и где.

Как программист, вы также можете попросить свою программу создать трассировку стека по требованию. Это может быть особенно полезно для обслуживания кода и устранения неполадок.

По теме:  Управление временем и датой в приложениях Go

Как вывести трассировку стека

В зависимости от версии вашего компилятора вы, скорее всего, получите удобочитаемую трассировку. Удобочитаемая трассировка предоставляет удобный текст об ошибке, в отличие от обычной трассировки. Это особенно верно для новых компиляторов. Поэтому лучший способ узнать о трассировках стека — создать их самостоятельно.

Вы можете создать трассировку стека без каких-либо ошибок в коде. Для этого просто используйте метод 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() для захвата исключений. Также важно учитывать и понимать различные типы ошибок, с которыми могут столкнуться ваши программы.