И снова StackTrace

  • 6
  • Недоступна
Давайте сразу перейдем к делу: напишите 5 методов, которые вызывают друг друга. Каждый метод должен возвращать имя метода, вызвавшего его, полученное с помощью StackTrace. Это имя — дальше, чем звезды. Но мы разберемся, это всего-навсего методы, которые последовательно вызывают друг друга, и ничего более.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (230)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ihor
Уровень 10, Мариуполь, Украина
3 августа, 04:59
Что означает [2]?
Thread.currentThread().getStackTrace()[2].getMethodName();
31 июля, 10:46
Можете вот тут почитать.
Евгений
Уровень 11, Москва
5 мая, 06:14
Мне очень помог комментарий Ярослава, от 18го года, к этой задаче. https://javarush.ru/users/1173070 Но все же осмысления как и что происходит не пришло. Тогда я сделал следующее: В класс добавил счетчик. Счетчик инкрементирую в каждом методе. А далее, начиная с 5го метода, понемногу накидывая выводы в консоль, пришел к следующему:
System.out.println("Вывод в method ||5||: счетчик методов в порядке возрастания |" + count + "|, имя метода по индексу[1]: " +
        Thread.currentThread().getStackTrace()[1].getMethodName());
System.out.println("Вывод в method ||5||: имя метода по индексу[2]: " + Thread.currentThread().getStackTrace()[2].getMethodName());
System.out.println("Вывод в method ||5||: имя метода по индексу[3]: " + Thread.currentThread().getStackTrace()[3].getMethodName());
System.out.println("Вывод в method ||5||: имя метода по индексу[4]: " + Thread.currentThread().getStackTrace()[4].getMethodName());
System.out.println("Вывод в method ||5||: имя метода по индексу[5]: " + Thread.currentThread().getStackTrace()[5].getMethodName());
System.out.println("Вывод в method ||5||: имя метода по индексу[6]: " + Thread.currentThread().getStackTrace()[6].getMethodName());
System.out.println("Вывод в method ||5||: имя метода по индексу[0]: " + Thread.currentThread().getStackTrace()[0].getMethodName());
System.out.println();
Каждый вновь вызванный метод добавляется в стэк, читай массив, под индексом 1. Ибо методы двигаются при добавлении нового. Запустили программу - автоматом создался массив StackTrace, метод getStackTrace() зашел в массив под индексом 0 и более никуда не двигается. Далее, зашел метод main - индекс 1, затем зашел method1 - индекс 1, main подвинулся на 2ой. И так далее. Счетчик же растёт начиная с последнего зашедшего метода. Попробуйте, возможно поможет кому-то. Почему getStackTrace() не двигается - так я и не понял.
Евгений N
Уровень 13
18 апреля, 20:03
если в решении заменить method2(); на System.out.println( method2() ); и т.д. задача станет нагляднее. Валидацию проходит.
Денис
Уровень 18, Пермь, Россия
17 февраля, 13:53
массив[0] - это и есть сам стэктрайс, [1] - это метод в котором находится стэктрейс, а вот [2] это имя метода который его вызвал return Thread.currentThread().getStackTrace()[Х].getMethodName(); Чтобы понять что от нас требуется, поиграйтесь со значениями X
Neonila Kravtcova
Уровень 19, Санкт-Петербург, Россия
25 ноября 2021, 09:22
Это была задача Hard для меня. Зато кое-что прояснилось, спасибо.
Дима
Уровень 16, Новая Каховка, Украина
1 августа 2021, 09:52
Для меня самое сложное, это перебороть себя и зайти в коменты под задачей, за объясненьями, после чего всё кажется простым)) Но как же хочется просто открыть задачу и просто написать код правильно(((
gypsy potassium
Уровень 12, Урюпинск
14 сентября 2021, 17:28
перебороть себя и НЕ заходить в каменты до последнего
Neonila Kravtcova
Уровень 19, Санкт-Петербург, Россия
25 ноября 2021, 09:23
Это был последний коммент, дальше которого я не пошла ))
Rodion
Уровень 20, Munich, Germany
14 апреля 2021, 20:32
Прекрасный пример задачи, где теория идет бок о бок с практикой.
Михаил
Уровень 19, Харьков, Украина
16 марта 2021, 21:49
Было сложновато но я справился, что бы понять как оно работает я в каждом методе выводил номер массива на экран вот так :
public static String method1() {
   method2();
    //напишите тут ваш код
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    System.out.println(stackTraceElements[2].getMethodName());
    return stackTraceElements[2].getMethodName();
}
и выяснил что массив[0] - это и есть сам стэктрайс, [1] - это метод в котором находится стэктрейс, а вот [2] это имя метода который его вызвал. Ну и если совсем туго с этим моментом вот объяснение с гит хаба тут прям совсем по полочкам
Yolkovich покаещеназаводе
9 июня 2021, 23:50
максимум пользы от гитхабовской статьи будет если скопировать ее в IDE и поиграться с ней, у меня сложилась вся картинка.
w0e666
Уровень 11, Киев, Украина
22 февраля 2021, 20:38
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        return stackTraceElements[2].getMethodName();