12
Дек
2016

Помогите разобраться с StackTraceElement[]

Доброго времени суток. Помогите понять суть StackTrace.

В учебном материале даётся объяснение

Java-машина ведет запись всех вызовов функций. У нее есть для этого специальная коллекция – стек. Когда одна функция вызывает другую, Java-машина помещает в этот стек новый элемент StackTraceElement. Когда функция завершается этот элемент удаляется из стека. Таким образом, в этом стеке всегда хранится актуальная информация о текущем состоянии «стека вызовов функций»

Далее приводится пример

 public static void main(String[] args)
  {
    method1();
  }

  public static void method1()
  {
    method2();
  }

  public static void method2()
  {
    method3();
  }

  public static void method3()
  {
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    for (StackTraceElement element : stackTraceElements)
    {
       System.out.println(element.getMethodName());
    }
  }

В результате выполнения которого мы получаем

getStackTrace
method3
method2
method1
main

Если я правильно все понимаю, то конструкция

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

работает следующим образом:

//Cоздаём переменную типа StackTraceElement[]
StackTraceElement[] stackTraceElements 

//Присваеваем ей ссылку на текущий поток и заносим в массив специальные элементы StackTrace
Thread.currentThread().getStackTrace()

Вопрос №1: каким образом в этом массиве StackTraceElement[] вся информация о вызываемых методах, если сказано, что после выполнения метода информация из стека удаляется?

Вопрос №2: В одном из заданий просят вернуть имя метода, который его вызывает

 public static void main(String[] args) throws Exception
{
    method1();
}

public static String method1()
{
    method2();
    return Thread.currentThread().getStackTrace()[2].getMethodName();


}

public static String method2()
{
    method3();
    return Thread.currentThread().getStackTrace()[2].getMethodName();
}

public static String method3()
{
    method4();
    return Thread.currentThread().getStackTrace()[2].getMethodName();
}

public static String method4()
{
    method5();
    return Thread.currentThread().getStackTrace()[2].getMethodName();
}

public static String method5()
{
    return Thread.currentThread().getStackTrace()[2].getMethodName();
}

Каким образом работает конструкция

return Thread.currentThread().getStackTrace()[2].getMethodName();

если мы не создавали StackTraceElement[]. Значит ли это, что он неявно создается JVM при выполнении программы?

Источник: https://ru.stackoverflow.com/questions/602728/%D0%9F%D0%BE%D0%BC%D0%BE%D0%B3%D0%B8%D1%82%D0%B5-%D1%80%D0%B0%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D1%8C%D1%81%D1%8F-%D1%81-stacktraceelement

Share

Тебе может это понравится...