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

  • 3
  • Недоступна
Стек вызовов, может, не самая красивая конструкция… Хотя почему нет? Он логичен, к нему просто привыкнуть нужно. Привыкаем с задачами! В этот раз вам нужно написать пять методов, которые вызывают друг друга. Метод должен вернуть номер строки кода, из которого вызвали этот метод. Для этого воспользуйтесь функцией: element.getLineNumber().
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (172)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Rodion
Уровень 17, Германия
14 апреля, 20:36
Статья в которой по полочкам раскладывают решение подобных задач: https://gist.github.com/Chikitonik/6db052dcb3f98b134a25b5a4babfcb32
Андрей Бугаев
Уровень 25
30 июня, 18:58
очень полезная ссылка, спасибо
Vladimir
Уровень 17, Нижний Новгород, Россия
17 марта, 19:03
System.out.println(Thread.currentThread().getStackTrace()[2].getLineNumber()); Почему 3ий элемент каждый раз - getStackTrace()[2] ?
Yaroslav
Уровень 15, Санкт-Петербург, Россия
1 апреля, 11:36
Если я правильно понял Ваш вопрос, попробую объяснить: StackTraceElement[] является массивом, в который мы поочередно заносим вызовы методов. Очередность здесь такая - последний положенный будет взят первым. method1(): -Последний вызов был сам getStackTrace, соответственно он кладется первым в массив - [0] -getStackTrace вызывается из method1(), значит method1() кладется в массив следующим - [1] -method1() вызывался в main, значит main кладется в массив следующим - [2] method2(): -Последний вызов был сам getStackTrace, соответственно он кладется первым в массив - [0] -getStackTrace вызывается из method2(), значит method2() кладется в массив следующим - [1] -method2() вызывался в method1(), значит method1() кладется в массив следующим - [2] -method1() вызывался в main, значит main кладется в массив следующим - [3] и т.д. Так и получается, что каждый раз нас интересует [2] "номер строки кода, из которого вызвали этот метод" каждый раз на одном и том же месте.
Михаил Никитюк
Уровень 9, Харьков, Украина
16 марта, 22:00
Почему когда вводишь 0
public static int method1() {
    method2();
    System.out.println(Thread.currentThread().getStackTrace()[0].getLineNumber());
    return  Thread.currentThread().getStackTrace()[0].getLineNumber();
}
на выходе получаешь такое вот число
1598
Данил
Уровень 27
26 марта, 17:08
Потому что функция getStackTrace() находится на 1598й строчке кода в библиотеке Thread
Алексей Сивенков
Уровень 15, Москва
22 февраля, 20:15
https://javarush.ru/groups/posts/2972-stack-trace-i-s-chem-ego-edjat Может уже кто то скидывал- на всякий продублирую
Nimgvae
Уровень 12, Брауншвейг, Германия
8 февраля, 16:09
Надо погуглить эту тему, что то я не совсем понимаю.
Den Business Automation Leade в Affect
11 января, 20:38
Я очень рекомендую для понимания тем, кто работает в IDEA выводить значения через System.out.println В каждом из методов получаем стэк-трейс массив
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
Затем, через sout смотрим что к чему. Т.к. 0 элемент в массиве нас не интересует - это будет getStackTrace() то начнём с 1 элемента
public static int method1() {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        System.out.println(stackTraceElements[1].getLineNumber());
        method2();
        return  /*напишите тут ваш код*/ 0;
    }
такой вариант выведет нам: строчку, на которой расположено: StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); таким образом, мы понимаем, что это не то, что мы ищем. Нас интересует строка, где из метода main вызывался method1() Значит ставим следующий элемент 2:
public static int method1() {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        System.out.println(stackTraceElements[2].getLineNumber());
        method2();
        return  /*напишите тут ваш код*/ 0;
    }
Это и будет то, что нам нужно. Осталось убрать sout и прописать это всё в return
Евгений
Уровень 14
4 января, 11:52
Другими словами я хочу вызывать номер строки сразу же после вызова метода.
Евгений
Уровень 14
4 января, 11:43
Я не понимаю в какой момент инициализировать массив StackTraceElement[] stackTraceElements чтобы можно было вывести значения строк на экран ?
selfer IllegalArgumentException в вашей программе
11 января, 15:38
Если хочешь вывести все строки, то порассуждай, где дни могут быть все? Подсказка: в методе main тебе выведет только 2 строки.
Владимир Коземаслов Жук в Муравейнике
10 ноября 2020, 16:08
Для понимания работы StackTrace написал цикл, который выводит на экран сначала название метода, а потом номер строки где он был вызван. for (StackTraceElement stackTraceElement : stackTraceElements) { System.out.println(stackTraceElement.getMethodName()); System.out.println(stackTraceElement.getLineNumber()); } Но оказалось что первое значение т.е. stackTraceElement[0].getLineNumber() возвращает номер строки в классе Thread под номером 1598, а номер строки где был вызван getLineNumber() в классе Solution возвращает stackTraceElement[1].getLineNumber(), номер строки где был вызван метод возвращает stackTraceElement[2].getLineNumber().
Семен Константинов
Уровень 30, Казань
8 ноября 2020, 09:40
Thread.currentThread().getStackTrace()[2].getLineNumber() я все равно пока не понимаю что делаю
Maksim Gorshtein
Уровень 15, Ашкелон, Израиль
23 ноября 2020, 05:55
Мне тоже не понятно, чем мы тут занимаемся...задания типа: "Сделай "это", используя "то"...". Что значит "это" и "то" и как это использовать в разных ситуациях...Хотя бы давали по-больше примеров...
Имя Фамилия
Уровень 19, Москва
10 декабря 2020, 16:59
Не могу похвастаться, что прямо всё понимаю - каша в голове ещё та, но мне сильно помогают комментарии к задачам от других учащихся. Если ты их редко и мало читал, то очень рекомендую - довольно часто попадаются понятные объяснения "на пальцах" того, чего до этого никак было не понять. Ну и плюс в комментах почти всегда годные ссылки на доп.материалы