Поиск по сайту:

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

Статьи по данной тематике: