StackTrace

Открыта

— Привет! Сегодня я расскажу тебе, что такое стек-трейс. Но сначала расскажу, что такое стек.

— Представь себе стопку бумаг — деловых поручений для некоторого исполнителя. Сверху на стопку можно класть новое задание, и с верха стопки задание можно брать. При таком подходе задания будут исполняться не по порядку поступления. Задание, положенное самым последним, будет взято исполнителем самым первым. Такая структура элементов коллекции называется стеком – стопкой.

В Java для этого есть специальная коллекция – Stack. Это коллекция, у которой есть методы «добавить элемент» и «взять(достать/забрать) элемент». Как ты уже догадался, первым будет взят элемент, добавленный самым последним.

— Хм. Вроде не сложно и понятно.

— Отлично. Тогда сейчас объясню, что такое стек-трейс.

— Представь себе, что в Java функция А вызвала функцию Б, а та вызвала функцию В, а та, в свою очередь, функцию Г. Так вот, чтобы выйти из функции Б, нужно сначала выйти из функции В, а для этого выйти из функции Г. Это очень похоже на стек.

— А чем похоже?

— В стопке тоже, чтобы добраться до какого-то листка с заданием, надо довыполнить все задания, которые положили сверху.

— Ну, некоторая аналогия есть, но не уверен, что я все понял правильно.

— Смотри. Стек – это набор элементов. Как листы в стопке. Чтобы взять третий сверху лист, надо сначала взять второй, а для этого взять первый. Класть и брать листы можно всегда, но всегда взять можно только самый верхний.

— С вызовом функций то же самое. Функция А вызывает функцию Б, а та вызывает функцию В. И чтобы выйти из А, надо сначала выйти из Б, а для этого надо выйти из В.

— Подожди. Если я все правильно понял, то весь этот стек сведется к «взять можно только самый последний положенный лист», «выйти можно только из последней функции, в которую зашли». Так?

— Да. Так вот – последовательность вызовов функций — это и есть «стек вызовов функций», он же просто «стек вызовов». Функция, вызванная последней, должна завершиться самой первой. Давай посмотрим это на примере:

Получение и вывод текущего стека вызовов:
public class ExceptionExample
{
  public static void main(String[] args)
  {
    method1();
  }

  public static void method1()
  {
    method2();
  }

  public static void method2()
  {
    method3();
  }

  public static void method3()
  {
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    for (StackTraceElement element : stackTraceElements)
    {
       System.out.println(element.getMethodName());
    }
  }
}
Вот какой результат мы получим:
getStackTrace
method3
method2
method1
main
9
Задача
Java Syntax Pro Beta,  9 уровень1 лекция
Недоступна
Утильный класс: часть 1
Реализуй методы sin(double), cos(double), tan(double) которые возвращают синус, косинус и тангенс угла соответственно, полученного как параметр. Угол задан в градусах. В этом тебе помогут соответствующие методы класса Math, которые принимают параметром угол, заданный в радианах.

— Ок. С вызовом функций похоже все понятно. А что это еще за StackTraceElement?

— Java-машина ведет запись всех вызовов функций. У нее есть для этого специальная коллекция – стек (Stack). Когда одна функция вызывает другую, Java-машина помещает в этот стек новый элемент StackTraceElement. Когда функция завершается этот элемент удаляется из стека. Таким образом, в этом стеке всегда хранится актуальная информация о текущем состоянии «стека вызовов функций».

— Каждый StackTraceElement содержит информацию о методе, который был вызван. В частности можно получить имя этого метода с помощью функции getMethodName.

— В примере выше ты можешь видеть демонстрацию этого дела:

1) Получаем «стек вызовов»:

2) Проходимся по нему с помощью цикла for-each. Надеюсь, ты его еще не забыл.

3) Печатаем в System.out имена методов.

— Интересная штука и, похоже, совсем не сложная. Спасибо, Риша!

9
Задача
Java Syntax Pro Beta,  9 уровень1 лекция
Недоступна
Утильный класс: часть 2
Исправь методы класса Solution, используя класс Math: 1. sqrt(double) - должен возвращать квадратный корень переданного аргумента. 2. cbrt(double) - должен возвращать кубический корень переданного аргумента. 3. pow(int, int) - должен возвращать значение первого аргумента, возведенного в степень втор
9
Задача
Java Syntax Pro Beta,  9 уровень1 лекция
Недоступна
Минимальный элемент массива
В этой задаче тебе нужно: 1. Считать 10 чисел с консоли и заполнить ими массив с помощью метода getArrayOfTenElements(). 2. Найти минимальный элемент массива и вернуть этот элемент с помощью метода min(int[]). В методе min(int[]) обязательно используй метод Math.min(int, int).
Комментарии (225)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Stas Gritsenko
Уровень 25
5 января, 12:06
самая беспонтовая, унылая и неинформативная лекция
Julia Kizimenko
Уровень 22
19 мая 2023, 10:54
Как мы расскажем про StackTrace? В двух словах! Дадим ли мы задачи, в которых не разобраться без чтения других учебников и ПОЛНОСТЬЮ самостоятельного изучения темы? Конечно! Если без шуток, такую объёмную новую тему нужно объяснять развёрнуто! Давать больше примеров, объяснений, статей... Как в предыдущих лекциях, постепенно вводить в курс дела! А не так, что мы прочли крохотный текст, решили со скрипом задачи, а потом перешли на исключения! Либо надо отделить StackTrace и не смешивать его с исключениями, либо обе темы объяснять развёрнуто! А не вот это вот. Прежде, чем решать задачи, предлагаю прочитать хотя бы это: https://javarush.com/quests/lectures/questsyntaxpro.level14.lecture05
aiiirborne
Уровень 29
25 октября 2022, 19:27
Почему currentThread() не заносится в StackTrace? В выводе идет getStackTrace и после него сразу method3.
aiiirborne
Уровень 29
25 октября 2022, 19:54
Потому что мы из него уже вышли в момент захода в getStackTrace )
И. Ж.
Уровень 41
18 июня 2022, 18:54
Непонятно написано: указано что при каждом новом вызове метода элемент стека удаляется и на его место приходит другой, в то время как стек является коллекцией, получается в коллекции стеков всегда один элемент. И это еще выходит что элемент стека есть массив вызовов функций. Расплывчато обьяснено.
28 марта 2022, 12:42
Статический метод currentThread() класса Thread возвращает ссылку на объект типа Thread, который содержит информацию о текущей нити (о текущем потоке выполнения). Подробнее о нитях вы узнаете в 17 и 18 уровнях квеста Java Core. У этого объекта Thread есть метод getStackTrace(), который возвращает массив элементов StackTraceElement, каждый из которых содержит информацию об одном методе. Все элементы вместе и образуют stack trace.
Rinat
Уровень 16
1 ноября 2021, 10:04
зачем это необходимо? для отладки?
Иван
Уровень 23
18 июля 2022, 16:13
Аналогично интересно, зачем это?
Ars
Уровень 41
12 сентября 2021, 12:00
Представь себе, что в Java функция А вызвала функцию Б
Но в джаве нет функций! Только методы.
Yakov Bashkurov
Уровень 19
8 октября 2021, 13:12
на 1 лвле говорится, что метод == функция; но чаще используется термин "метод"
Maxim Evsyukov
Уровень 18
3 августа 2021, 11:23
Очень малоинформативная лекция. Читайте еще вот это https://javarush.com/groups/posts/2972-stack-trace-i-s-chem-ego-edjat
Benjam1nBTN
Уровень 24
14 сентября 2022, 05:21
Наверное в том и суть, чтобы дать первое общее представление. Всему своё время
Vadim Zhalnin
Уровень 17
31 июля 2021, 19:47
Похоже, совсем не сложная...