И снова StackTrace

  • 6
  • Недоступна
Давайте сразу перейдем к делу: напишите 5 методов, которые вызывают друг друга. Каждый метод должен возвращать имя метода, вызвавшего его, полученное с помощью StackTrace. Это имя — дальше, чем звезды. Но мы разберемся, это всего-навсего методы, которые последовательно вызывают друг друга, и ничего более.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (176)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Roman9 уровень, Москва
2 часа назад
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); String result = stackTraceElements[2].getMethodName(); return result;
Romana Reyna12 уровень, Москва
28 мая, 05:57
return Thread.currentThread().getStackTrace()[2].getMethodName();
.getStackTrace() возвращает массив, поэтому функцию получения имени метода .getMethodName() можно вызвать на нужном элементе массива. В данном случае метод, вызывающий метод, в котором мы пишем return лежит 3 сверху, то есть с индексом [2], потому что первым сверху лежит .getStackTrace() (да, он тоже метод и тоже считается) с индексом [0] и текущий метод с индексом [1], в котором мы пишем return. Скрин из лекции, на котором это видно:
HiQuality16 уровень, Львов
10 мая, 14:50
Нужно выводить 2 елемент по порядку, потому как они идут от конца к началу и следовательно над елементом будет тот, что его вызвал. Спасибо людям в комментариях.
Dmitry Gorchakov19 уровень, Москва
8 мая, 10:24
Выполнил задание корректно, методы возвращают строку с именем метода, который его вызвал. НО почему в методе main вызов любого из методов возвращает main? Если в методе main прописать System.out.println (method5()); вернется не method4 и даже не method3...2...1.. а main... почему? Потому что stackTrace перестраивается на другой путь? Метод5 вызван методом main? т.е. стек-трейс выбирает самый короткий путь? По сути же их два? 1) от мейн до метод5 через все методы, последовательно вызывающие друг друга 2) прямой от мейн до метод5
Dmitry Gorchakov19 уровень, Москва
8 мая, 11:09
Вопрос закрылся) через одно задание найдете для себя ответ, если появился такой же вопрос) ответ: обращаясь к методу 5, мы возвращаем стек-трейс метода 5 (main -> method5 -> stackTrace)
Roman Sharun16 уровень
5 мая, 10:45
Вариант обращения на прямую к стеку
Thread.currentThread().getStackTrace()[2].getMethodName()
у меня валидатор не принял. Поэтому ппришлось создавать массив в каждом методе и потом возвращать из массива имя третьего элемента
Fischerski10 уровень, Москва
5 мая, 12:54
Хмм... а у меня валидатор принял решение таким способом
Алексей Алхутов15 уровень, Nizhnevartovsk
7 мая, 16:11
У меня тоже принял
Roman Sharun16 уровень
8 мая, 07:05
Значит был какой-то временный глитч с валидатором. Жаль, потерял неколько попыток....
Татьяна18 уровень, Ростов на Дону
25 апреля, 21:29
Для любого метода: StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace(); //записываем в массив StackTrace все методы которые были запущены, пока программа дошла до этого момента включительно (по-моему и не только методы, но это не точно) например для самого последнего 5-го метода StackTrace[...] будет у нас содержать [0]getStackTrace [1]method5 [2]method4 [3]method3 [4]method2 [5]method1 [6]main т.е. было то всё наоборот, запустился main ->запустился method 1 -> где запустился method 2 и т.д. т.о. последним был метод получения имени метода (нулевой элемент массива StackTrace - getStackTrace ) перед ним был метод в котором мы находимся(первый элемент массива StackTrace - method5 ) а вот до него, был как раз метод, который нам нужен - "Каждый метод должен возвращать имя метода, вызвавшего его"(второй элемент массива StackTrace - method4) и похожий массив будет для каждого метода, только для первых он будет меньше, но нужный нам метод будет всё равно под номером 2 поэтому для любого метода: return StackTrace[2].getMethodName():
Glock13 уровень, Энгельс
1 мая, 16:54
спасибо, ели бы не ты не понял эту систему), а где можно это использовать?
Ismagilova Antonina10 уровень, Новосибирск
20 мая, 16:23
можно потом найти свою ошибку например. Я не совсем, правда понимаю как это делать, но точно видела муж, помогая мне, использовал это
Дмитрий12 уровень, Днепр
26 марта, 21:49
Кроме этого интересно, какая практическая польза от этого стака. Массивы, функции, да всё, что было до этого- понятно, и ясно, где применить, но это?!...
Igor Tarasov14 уровень, Свободный, Белебей
24 апреля, 07:25
Мб для обработки ошибок. Хотя думаю ответ вы сами уже знаете
Алексей Чернавцев22 уровень, Владивосток
23 марта, 13:23
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
return stackTraceElements[2].getMethodName();
Это нужно написать в каждом из пяти методов, метод меин не трогать. Номер [2] в методах не меняется :) Почему? Давайте объясню. Попробуем в методе5 вывести весь стек трейс:
public static String method5() {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
for (StackTraceElement element : stackTraceElements) {
       System.out.println(element.getMethodName()); }
        return stackTraceElements[2].getMethodName();
    }
Получится вот что: getStackTrace method5 method4 // [2] - нужный нам элемент. Нулевой элемент это обозначение, первый элемент - сам вызывающий метод. method3 method2 method1 main Теперь сделаю то же самое для метода 2 и получу: getStackTrace method2 method1 // [2] - вот видите, вызвавший метод всё равно под индексом два :) main Я старался) надеюсь, помог😇
Иван14 уровень
12 апреля, 00:51
Отлично!!! Спасибо! А я думал что нужно 1 брать!
Ivan D18 уровень
17 апреля, 15:24
Спасибо огромное! С вашим примером я понял устройство и способы работы намного лучше и смог все задачи решить :)
21 мая, 08:35
очень помог понять, спасибо
Юрий Лубенченко12 уровень, Киев
27 мая, 12:12
Cпасибо, наглядно и понятно разложено
Алан24 уровень, Vladikavkaz
18 марта, 06:39
Подскажите, почему в данном примере не надо объявлять объект класса StackTraceElement?
madiar16 уровень, Алматы
15 марта, 19:01
stackTraceElements[2] а что озночяет 2
Evgeny Siganov9 уровень, Москва
вчера, 09:49
номер ячейки массива