Кто меня вызывал?

  • 3
  • Недоступна
Стек вызовов, может, не самая красивая конструкция… Хотя почему нет? Он логичен, к нему просто привыкнуть нужно. Привыкаем с задачами! В этот раз вам нужно написать пять методов, которые вызывают друг друга. Метод должен вернуть номер строки кода, из которого вызвали этот метод. Для этого воспользуйтесь функцией: element.getLineNumber().
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (118)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Tamerlan Amaev15 уровень, Подмиланье
25 мая, 08:59
Я понял одно, я совершенно не понял эту тему. Попробую все с начала...
Dmitriy Zinevich10 уровень, Санкт-Петербург
17 мая, 10:48
После прочтения лекции совсем не понял, что здесь делать. В основном советы как решать в комментариях дают люди с уровнем много больше, чем 9-й. Да, так себя успокаиваю. )
Alukard15 уровень, London
12 мая, 12:30
Без дополнительной информации непонятно как решать, но в условии ясно сказано используйте element.getLineNumber(). Я через форич и получил номер каждой строки посредством
System.out.println(element.getLineNumber());
А потом тупо вручную дописал эти номера в return на манер
return 33;
Это конечно не совсем то как надо было решить наверное но валидатор схавал с первого раза.
Дмитрий10 уровень
17 мая, 14:23
StackTraceElement[] stackTraceElement = Thread.currentThread().getStackTrace(); StackTraceElement element = stackTraceElement[2]; return element.getLineNumber(); в каждом методе, только еще не понял почему "2" ... в stackTraceElement[2];
Alukard15 уровень, London
17 мая, 14:54
скоро поймешь😄
Дмитрий10 уровень
18 мая, 08:58
уже допЁр ))) потомуШо ПРЕД ПОС ЛЕД НИЙ ))))
Roman Sharun16 уровень
5 мая, 10:52
This is magic!!! Тут я почувствовал себя кодером, анализирующем чужой код!!!
Татьяна18 уровень, Ростов на Дону
25 апреля, 21:55
Как и в прошлой задаче получаем массив методов, которые вызывались: Для любого метода:
StackTraceElement[] element = Thread.currentThread().getStackTrace();
//записываем в массив element все методы которые были запущены, пока программа дошла до этого момента включительно (по-моему и не только методы, но это не точно) например для самого последнего 5-го метода массив element[...] будет у нас содержать [0]getStackTrace [1]method5 [2]method4 [3]method3 [4]method2 [5]method1 [6]main последним был метод получения имени метода (нулевой элемент массива element - getStackTrace ) перед ним был метод в котором мы находимся(первый элемент массива element - method5 ) а вот до него, был как раз метод, который нам нужен - "Каждый метод должен возвращать номер строки кода, из которого вызвали этот метод"(второй элемент массива element - method4) и похожий массив будет для каждого метода, только для первых он будет меньше, но нужный нам метод будет всё равно под номером 2 поэтому для любого метода узнаем в какой строке был наш [2] element массива и возвращаем эту строку
return element[2].getLineNumber();
Вадим15 уровень, Саранск
28 апреля, 19:57
Самому не охота все расписывать, поэтому подпишусь под этим постом. В принципе все правильно и понятно сказано
Иван11 уровень, Москва
12 мая, 11:52
Извините, а почему нужный нам метод будет все равно под номером 2? Потому что предыдущие удаляются?
Татьяна18 уровень, Ростов на Дону
13 мая, 17:16
По заданию - "Каждый метод должен возвращать номер строки кода, из которого вызвали этот метод" нас не интересует нулевой метод (название метода лежит внутри массива в нулевом элементе), т.к. это метод получения имени нас не интересует первый метод, потому что мы должны найти метод, который его вызвал. А вызвал его следующий метод, как раз под следующим номером - 2. Предыдущие не удаляются, они просто нас не интересуют в условии данной задачи. Ну и нас интересует не сам метод, название которого находится в нашем массиве, а номер строки в которой он записан в нашем коде, вызвав у элемента .getLineNumber() мы получим искомое.
Татьяна18 уровень, Ростов на Дону
13 мая, 17:18
Я не повторяюсь, повторяюсь?)
Дмитрий10 уровень
17 мая, 14:25
ааа, нам нужен с конца предпоследний, а єто второй! точно!
Ксенія Українка20 уровень, Киев
7 апреля, 15:49
вот что делает валидатор и почему статик - плохая идея для задач)))
StackTraceElement []el= Thread.currentThread().getStackTrace();
        for (StackTraceElement els : el){
            System.out.println(els.getMethodName());
        }
вывод: getStackTrace method1 main main invoke0 invoke invoke invoke callMainMethod execute execute main main
Юрий16 уровень, Кишинёв
12 февраля, 13:14
Эта задачка похоже на предыдущую. Воспользуйтесь такой записью и вам станет яснее: /*напишите тут ваш код*/ System.out.println(" method 1 - " + Thread.currentThread().getStackTrace()[2].getLineNumber()); return Thread.currentThread().getStackTrace()[2].getLineNumber(); при проверки на валидацию, не забудьте убрать строку sout
Vasiliy18 уровень, Москва
15 марта, 17:06
Спасибо. Писал до этого в несколько строк)) так компактнее
Сергей Ретнев19 уровень, Москва
9 января, 09:47
А можно вспомнить что номер метода мы научились находить ранее: Thread.currentThread().getStackTrace()[2] и дописать к нему .getLineNumber()
Anton Domashevskiy12 уровень, Mlawa
20 января, 07:03
почему [2]? где почитать что бы разобраться?
Сергей Ретнев19 уровень, Москва
20 января, 07:35
Лучше не читать а вывести элементы 0 и 1. При наборе в идее, в выпадающем списке, можно нажать ctrl+q что бы увидеть описание метода и ctrl+b что бы увидеть его код. Если этого мало - гуглите по названию метода/ключевого слова
Итай23 уровень, Новосибирск
4 мая, 03:16
А где мы этому научились?
getStackTrace()[2]
В частности, где было написано, что к методу можно тупо дописать [2]?
Андрей Богданов11 уровень, замкадье...
5 января, 19:05
Забавная задача. На логическое мышление. Как найти номер строки? Можно прочитать кучу лекций и погуглить. А можно вывести на консоль массив и увидеть номер строки глазами 👍
Игорь Жуков13 уровень, Москва
2 января, 16:37
Вот затупил, с 8 попытки только решил. И то после изучения комментариев к задаче. Эх....