StackTrace

Java Syntax
9 уровень, 1 лекция
Открыта

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

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

— В 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, 9 уровень, 1 лекция
Недоступна
Утильный класс: часть 1
Утильный класс: часть 1

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

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

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

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

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

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

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

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

9
Задача
Java Syntax Pro, 9 уровень, 1 лекция
Недоступна
Утильный класс: часть 2
Утильный класс: часть 2
9
Задача
Java Syntax Pro, 9 уровень, 1 лекция
Недоступна
Минимальный элемент массива
Минимальный элемент массива
Комментарии (224)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Stas Gritsenko Уровень 29
5 января 2024
самая беспонтовая, унылая и неинформативная лекция
Julia Kizimenko Уровень 22
19 мая 2023
Как мы расскажем про StackTrace? В двух словах! Дадим ли мы задачи, в которых не разобраться без чтения других учебников и ПОЛНОСТЬЮ самостоятельного изучения темы? Конечно! Если без шуток, такую объёмную новую тему нужно объяснять развёрнуто! Давать больше примеров, объяснений, статей... Как в предыдущих лекциях, постепенно вводить в курс дела! А не так, что мы прочли крохотный текст, решили со скрипом задачи, а потом перешли на исключения! Либо надо отделить StackTrace и не смешивать его с исключениями, либо обе темы объяснять развёрнуто! А не вот это вот. Прежде, чем решать задачи, предлагаю прочитать хотя бы это: https://javarush.com/quests/lectures/questsyntaxpro.level14.lecture05
aiiirborne Уровень 29
25 октября 2022
Почему currentThread() не заносится в StackTrace? В выводе идет getStackTrace и после него сразу method3.
aiiirborne Уровень 29
25 октября 2022
Потому что мы из него уже вышли в момент захода в getStackTrace )
И. Ж. Уровень 41
18 июня 2022
Непонятно написано: указано что при каждом новом вызове метода элемент стека удаляется и на его место приходит другой, в то время как стек является коллекцией, получается в коллекции стеков всегда один элемент. И это еще выходит что элемент стека есть массив вызовов функций. Расплывчато обьяснено.
28 марта 2022
Статический метод currentThread() класса Thread возвращает ссылку на объект типа Thread, который содержит информацию о текущей нити (о текущем потоке выполнения). Подробнее о нитях вы узнаете в 17 и 18 уровнях квеста Java Core. У этого объекта Thread есть метод getStackTrace(), который возвращает массив элементов StackTraceElement, каждый из которых содержит информацию об одном методе. Все элементы вместе и образуют stack trace.
Rinat Уровень 16
1 ноября 2021
зачем это необходимо? для отладки?
Иван Уровень 23
18 июля 2022
Аналогично интересно, зачем это?
Ars Уровень 41
12 сентября 2021

Представь себе, что в Java функция А вызвала функцию Б
Но в джаве нет функций! Только методы.
Yakov Bashkurov Уровень 19
8 октября 2021
на 1 лвле говорится, что метод == функция; но чаще используется термин "метод"
Maxim Evsyukov Уровень 18
3 августа 2021
Очень малоинформативная лекция. Читайте еще вот это https://javarush.com/groups/posts/2972-stack-trace-i-s-chem-ego-edjat
Benjam1nBTN Уровень 24
14 сентября 2022
Наверное в том и суть, чтобы дать первое общее представление. Всему своё время
Vadim Zhalnin Уровень 17
31 июля 2021
Похоже, совсем не сложная...
Юличка Уровень 32
15 июня 2021
да нет, суть ясна. Кстати, если так подумать то ЭТА ЛОГИКА РАБОТАЛА И РАНЬШЕ. Вспомните, если открываем цикл и внутри него еще цикл и еще цикл, то сначала мы должны выйти из последнего ...

while(true){         // это цикл 1
    if(x > 3){         // это цикл 2
       for(x == 4){  // это цикл 3
       }                  //сначала выходим из цикла 3
   }                      //потом выходим из цикла 2
}                         //и только потом из цикла 1
Сергей Уровень 22
29 ноября 2021
"Цикл 2" это не цикл, это условие.
Артем Уровень 13
27 февраля 2022
Ветвление, если быть совсем точным