На этом шаге мы рассмотрим трассировку стека вызовов функций
Трассировка стека - это список вызовов методов в данной точке выполнения программы. Подобные списки вы могли видеть при выполнении программы, в которой не проверяется проверяемое исключение.
Для получения текстового описания трассировки стека достаточно вызвать метод printStackTrace() из класса Throwable.
Более удобный способ состоит в вызове метода getStackTrace(), возвращающего массив объектов типа StackTraceElement, которые можно проанализировать в программе, как в следующем примере кода:
Throwable t = new Throwable(); StackTraceElement[] stackTraceElements = t.getStackTrace(); for (StackTraceElement stackTraceElement : stackTraceElements) { анализ stackTraceElement }
Класс StackTraceElement содержит методы, позволяющие получить имя файла, номер исполняющей строки, а также имя класса и метода. Отформатированную строку, содержащую эти сведения, предоставляет метод toString(). А метод Thread.getAllStackTraces() позволяет получить трассировку стека во всех потоках.
Приведем ниже пример работы с трассировкой стека.
/** * <p>Класс для тестирования трассировки стека</p> * */ public class StackTraceTest { /** * <p>Функция для нахождения факториала. Перед расчетом факториала выводится * стек-трайс функции</p> * @param n Файкториал чего мы считаем * @return Значение факториала * */ public static int factorial(int n) { System.out.println("factorial(" + n + "):"); Throwable throwable = new Throwable(); StackTraceElement[] stackTraceElements = throwable.getStackTrace(); for (StackTraceElement stackTraceElement : stackTraceElements) { System.out.println(stackTraceElement); } int ans = 1; if (n > 1) { ans = n * factorial(n - 1); } System.out.println("return " + ans); return ans; } public static void main(String[] args) { factorial(3); } }
Проект можно взять здесь
Рис. 1. Вывод программы
На следующем шаге мы рассмотрим применение утверждений