public class Solution {
public static void main(String[] args) throws Exception {
method1();
}
public static String method1() {
method2();
StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace();
System.out.println(StackTrace[2].getMethodName());
return StackTrace[2].getMethodName();
}
public static String method2() {
method3();
StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace();
System.out.println(StackTrace[2].getMethodName());
return StackTrace[2].getMethodName();
}
public static String method3() {
method4();
StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace();
System.out.println(StackTrace[2].getMethodName());
return StackTrace[2].getMethodName();
}
public static String method4() {
method5();
StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace();
System.out.println(StackTrace[2].getMethodName());
return StackTrace[2].getMethodName();
}
public static String method5() {
{
StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace();
System.out.println(StackTrace[2].getMethodName());
return StackTrace[2].getMethodName();
}
}
}
Короче говоря не понял, а нашел ответ в обсуждениях. Получается, что стэк это массив методов, нумерация которого начинается так же с [0]. Тогда почему в коде в каждом методе мы выводит и возвращаем имя [2] элемента и этого правильно, ведь по сути мы выводим method4 тогда, а выводятся и возвращаются всё равно другие значения и имена других методов. Рустем
22 уровень
Объясните почему именно так ?
Решен
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Дмитрий
12 сентября 2018, 08:48решение
Сам разбираюсь, но постараюсь ответить. В методе method5() в System.out.println(StackTrace[2].getMethodName()); поизменяем цифры. Получим на выходе:
[0] - getStackTrace
[1] - method5
[2] - method4
[3] - method3 итд.
Т.е прописывая [2] мы всегда возвращаем метод, который вызвал текущий метод т.е для метода5 это будет метод4, для метода3 - метод 2 итд
0 - getStackTrace
1 - имя метода (свое имя)
2 - имя метода кто вызвал...
3 - имя метода кто вызвал...
4 - и т.д.
+17
Артем DivertittoSenior Android-разработчи в United TechMaster
12 сентября 2018, 08:06
Стэк это просто массив, который работает по принципу - первый вошел, последний вышел.
В нем хранятся данные о вызовах методов.
Самый первыйм был вызван метод main, значит он будет последний в стеке.
Подебаж код, всё поймешь
+2
Рустем
12 сентября 2018, 12:17
да дебажил все равно недопетрил как это работает. я понимаю, что такое массив, что в нём хранятся данные, здесь я понимаю в массиве получится 7 элементов. [0] - Stacktrace элемент и дальше в обратном порядке все методы, которые имеются у нас в коде. Но блин, если я допустим из 2 метода вызываю 3 метод, то я во втором методе должен возвращать имя первого метода так как 2 метод был вызван именно из под него, но почему то мы указываем в нём элемент с индексом [2], впрочем как и во всех других методов, в которых возвращаем значения.
+1
Siarhei
4 октября 2018, 11:57
столкнулся с такой же проблемой, в общем основной момент, который вроде как очевиден оказался по итогу, но его нигде не проговаривают: в каждом методе стектрейс будет свой. Для понимания этого вопроса я в каждый метод поместил цикл
StackTraceElement [] stackTraceElements = Thread.currentThread().getStackTrace();
for (int i=0; i<stackTraceElements.length; i++)
{
System.out.println(i+" "+stackTraceElements[i].getMethodName());
}
В итоге от метода5 к методу1 стектрейс укорачивался. И как раз выходило что нулевой всегда - это метод getStackTrace, первый - текущий метод, второй - метод который вызывает текущий метод.
+5