package com.javarush.task.task06.task0616;
/*
Минимальное число статиков
*/
public class Solution {
public static int step;
public static void main(String[] args) {
method1();
}
public static void method1() {
method2();
}
public static void method2() {
new Solution().method3();
}
public void method3() {
method4();
}
public void method4() {
step++;
for (StackTraceElement element : Thread.currentThread().getStackTrace())
System.out.println(element);
System.out.println("------------------------------------------------------");
if (step > 1)
return;
main(null);
}
}
РЕЗУЛЬТАТ:
java.lang.Thread.getStackTrace(Thread.java:1559)
com.javarush.task.task06.task0616.Solution.method4(Solution.java:28)
com.javarush.task.task06.task0616.Solution.method3(Solution.java:23)
com.javarush.task.task06.task0616.Solution.method2(Solution.java:19)
com.javarush.task.task06.task0616.Solution.method1(Solution.java:15)
com.javarush.task.task06.task0616.Solution.main(Solution.java:11)
------------------------------------------------------
java.lang.Thread.getStackTrace(Thread.java:1559)
com.javarush.task.task06.task0616.Solution.method4(Solution.java:28)
com.javarush.task.task06.task0616.Solution.method3(Solution.java:23)
com.javarush.task.task06.task0616.Solution.method2(Solution.java:19)
com.javarush.task.task06.task0616.Solution.method1(Solution.java:15)
com.javarush.task.task06.task0616.Solution.main(Solution.java:11)
com.javarush.task.task06.task0616.Solution.method4(Solution.java:33)
com.javarush.task.task06.task0616.Solution.method3(Solution.java:23)
com.javarush.task.task06.task0616.Solution.method2(Solution.java:19)
com.javarush.task.task06.task0616.Solution.method1(Solution.java:15)
com.javarush.task.task06.task0616.Solution.main(Solution.java:11)
------------------------------------------------------
Все методы вызываются 2 раза(через debug проверила), то есть должен быть вывод на экран всех вызовов - это с getStackTrace...main.
Но при повторном вызове metod4 в стек уже не попадает строка java.lang.Thread.getStackTrace (ставила точку остановки на 1559 - все ок, заходит туда дважды), что за особенность такая?
Mike
39 уровень
Задача принята, но не могу понять вывод результата
Решен
Комментарии (14)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Стас Пасинков Software Developer в Zipy Master
15 марта 2018, 22:45
условия и вашего кода слегка не хватает тут :)
0
Стас Пасинков Software Developer в Zipy Master
16 марта 2018, 19:57
у меня иногда исключения когда на экран выводятся - то тоже бывает не по порядку...)) точнее, между нужными мне строками исключения бывает влазят строки из выполнения программы (не красненькие).
так и тут. посмотрите, может строка java.lang.Thread.getStackTrace где-то в другом месте два раза выводится?)
0
Mike
16 марта 2018, 21:43
Нет. Два раза не выводится нигде(( Уже поиском проверяла.
Более того, тут есть параметр - step (кол-во шагов, то сколько раз нужно программу запустить), пробовала его менять - тоже самое java.lang.Thread.getStackTrace попадает в стек только на первой итерации, хотя под отладчиков все один-в-один проходит нужное количество раз.
Ладно, впринципе, это не криминально) Просто чисто любопытно стало, что за фича такая у стека вызовов.
0
Mike
15 марта 2018, 22:36
Немного прояснилась ситуация.
Первый раз в стеке было с getgetStackTrace по main.
Второй вывод стека - предыдущие вывел, то есть с getgetStackTrace по main и текущий прибавился с method4 по main
Новый вопрос - почему второй раз не вызвалась функция getgetStackTrace???
По идее должно быть три method1...4, три main и три getgetStackTrace, а их только два getgetStackTrace
0
Евгений ГродноExpert
15 марта 2018, 22:45
вы задали вопрос, но не показали код. То ответ будет из уровня, гадаем на кофейной гуще...
0
Mike
15 марта 2018, 23:16
поправила...
0
Евгений ГродноExpert
15 марта 2018, 23:23
так вы проследите выполнение программы начиная с main, и разберитесь в последовательности.
p/s вам может помочь дебагер, посмотрите видео, как научиться с ним работать, там сможете проследить последовательность выполнения программы по шагам. И вы получите все ответы.
0
Евгений ГродноExpert
16 марта 2018, 12:31
Особенности странной тут нет, разберитесь с этой строкой
Что она делает? 0
Mike
16 марта 2018, 16:38
вызов main. И что?
0
Евгений ГродноExpert
16 марта 2018, 18:57
или я вас не понимаю что вы хотите, или что то другое, но не суть
Что вам не нравится в выводе в консоль?
и поясните что вы имеете ввиду тут:
должны быть тройки всех методов <-
0
Mike
16 марта 2018, 21:07
Я прикрепила результат вывода на консоль, если вы обратите внимание, что строка java.lang.Thread.getStackTrace(Thread.java:1559) повторяется всего два раза.
А все остальные строки, например, com.javarush.task.task06.task0616.Solution.method4(Solution.java:28) повторяются три раза.
Почему?
Если вы запустите скрипт программы под отладчиком и поставите точки останова, напротив строк, указанных в скобках, то они ровно все аккуратно будут пройдены,однако в стеке это не отразится.
0
--------Master
16 марта 2018, 21:58
Потому что при повторном вызове main стек не обнуляется, а продолжает заполняться: main вызывается из method4, затем - method1 из main и т.д., в результате стек и заполняется второй раз теми же методами, а getStackTrace выводится именно по факту вызова, один раз. При этом первого вызова getStackTrace в стеке и не может быть - он добавляется именно в самом методе getStackTrace, и удаляется по возвращении из метода.
+1
Mike
16 марта 2018, 22:23
спасибо) с заполнением стека мне понятно было, именно нюанс с getStackTrace интересовал, теперь все ясно
0
Mike
16 марта 2018, 22:36
да, при выходе из метода из стека элемент же удаляется, и как я забыла...глупейшая ошибка
0