StackTrace

Открыта
StackTrace - 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
3
Задача
Java Syntax,  9 уровень,  1 лекция
Недоступна
Набираем код Ӏ Java Syntax: 9 уровень, 1 лекция
Java Syntax: 9 уровень, 1 лекция. Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.

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

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

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

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

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

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

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

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

Комментарии (139)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Dan9 уровень
4 часа назад
просто чтоб все вместе не мешать, выходит, что Stack-это обычная коллекция, на ряду с LinkedList и ArrayList, но эта коллекция работает по такому же принципу, как и трассировка стека (Stack trace), т.е. первым достается тот объект, что был добавлен последним, и порядок в этой коллекции поменять никак нельзя? или вы меня окончательно запутали, и Stack это какая-то служебная коллекция именно для списка методов?
AsadMamedov10 уровень, Москва
24 мая, 22:04
Вопрос: А как сделать так чтобы метод возвращал getMethodName? Я что-то не понял. Просто везде объясняется как это делают с помощью цикла в маине. А так щупаю-щупаю и никак не нащупаю как в методе вернуть =) Помогите =)
Игорь Birt16 уровень, Тирасполь
19 апреля, 08:58
getClassName() - какой класс хранит??? тот, в котором находится данный метод, или тот из которого он вызван?
Алексей19 уровень, Санкт-Петербург
21 апреля, 11:54
getClassName() - это метод класса StackTraceElement. В intellij idea набрав код можно зажать Ctrl и кликнуть мышкой по классу/методу. И тебе перебросит в этот класс/метод.
Alexandr Mihailovich16 уровень, Kursk
6 мая, 21:56
ничего в себе не хранит, этот метод класса StackTraceElement возвращает строковое значение имени класса из которого был вызван.
Danil Kambulov17 уровень
16 апреля, 22:45
Кто не понял данную тему. Прикрепляю две ссылочки, где понятными словами все про StackTrace расписано 1 сылка вторая
Егор12 уровень, Хабаровск
14 мая, 04:35
далеко не все
niks19 уровень, Москва
20 марта, 08:05
Зачем тут методы функциями называются?
Artem16 уровень, Рига
25 апреля, 11:09
кто на что горазд
Sayana19 уровень, Москва
6 марта, 10:49
Что значит выйти из функции? Типа вызвать ее?
BariO16 уровень, Nizhniy Novgorod
12 марта, 06:48
вызвать это войти. а выход это когда метод завершил свой код
Андрей12 уровень, Самара
8 апреля, 15:39
Это когда метод либо заканчивается, либо в нем встречается return.
Alex Li19 уровень
5 марта, 13:27
Хорошая лекция доступна тут лекция по StackTrace И не забываем прожимать лайк, вам не сложно, мне приятно размещать полезную информацию)
Фёкла19 уровень, Москва
21 февраля, 09:14
Теории, конечно, пожалели...
Alex Li19 уровень
5 марта, 13:29
прочтите эту лекцию и все будет понятно)
Андрей14 уровень, Москва
7 февраля, 18:07
Ну вот , а говорили что после восьмого всё как по маслу, но мозг уже привычно шепчет : "Хозяин, не понимаю. Что не понимаешь? Вот не понимаю, если вы создаете массив, то почему после знака равенства стоит не new массив , а какая то зловещая черная труба с двумя последовательными методами. И если это массив , то в его ячейки надо как -то закачивать и извлекать данные. Как эта труба делает? И можно в этот массив самому что-то закинуть в какую-нибудь ячейку и самому взять из выбранной ячейки. Короче чувствую себя ребенком, изучающим окружающий мир.
Anonymous #107680312 уровень, Харьков
28 февраля, 12:48
Если нет new, значит вы обращаетесь к статическому методу самого класса, а не объекта этого класса. Это тема прошлых лекций про static / не static.
Сергей20 уровень, Самара
7 февраля, 12:06
как правильно называеться класс стэка? получается из стэка выводится последовательность выполнения методов, верно? StackTraceElement один на всех? и в нем меняеться значение, или StackTraceElement много одинаковых?