Как понять, как работает StackTraceElement?

Я очень новичок в программировании. Я пытаюсь учиться в Code Gym. Но я все еще не понимаю некоторых вещей. Например, почему так важно поместить StackTraceElement[]... в последний метод цепочки, чтобы он мог напечатать все методы, которые использовались в этой «цепочке». Почему я не могу начать использовать этот код в основном методе, как во втором блоке кода. Извините, если это звучит глупо, я просто не понимаю.

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

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

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

  public static void method3()
  {
     StackTraceElement[] stackTraceELement = Thread.currentThread().getStackTrace();
    for (StackTraceElement element : stackTraceELement)
    {
       System.out.println(element.getMethodName());
    }
  }
}
public class ExceptionPrzyklad
{
  public static void main(String[] args)
  {
    StackTraceElement[] stackTraceELement = Thread.currentThread().getStackTrace();
    for (StackTraceElement element : stackTraceELement)
    {
       System.out.println(element.getMethodName());
    }

    method1();
  }

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

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

  public static void method3()
  {
    
  }
}

Потому что стек заполняется во время выполнения. Если вы проверили трассировку стека в main, как среда выполнения узнает, что произойдет в цепочке методов? Откуда ему знать, например, что method1 абсолютно точно вызовет method2 и что JVM не выйдет из строя до того, как она будет вызвана?

Federico klez Culloca 01.07.2024 11:26
getStackTrace() возвращает фактический стек, во втором примере кода методы еще не были выполнены, поэтому их нет в стеке (StackTraceElement добавляется в текущий стек при вызове каждого метода и удаляется после возврата из этого вызова метода)
user85421 01.07.2024 11:26

Почему трассировка стека, созданная во втором примере, должна содержать method1()? Ваш метод main вызывает множество методов: currentThread(), getStackTrace(), getMethodName(), println(…) и method1(). Почему трассировка стека должна содержать method1(), а не какой-либо другой метод? На вопрос «Где я?» есть ответ. без двусмысленности, а не на вопросы типа «Где я был?» или «Где я буду?»

Holger 01.07.2024 11:43

Прекрасные милые люди, спасибо за Вашу помощь. Кажется, я наконец понял, но это далось нелегко. Поправьте меня, если я ошибаюсь, но «читает» ли объект stackTraceELement все методы, которые использовались до этого момента? Так вот почему, когда я использую его в основном методе, он просто читает только этот метод, потому что все остальные методы еще не запущены? Сначала для меня это было неочевидно, так как я думал, что основной метод "знает" все, что происходит в программе, от начала до конца рабочей программы.

CodingNoob98 01.07.2024 21:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Определение StackTrace:

Трассировка стека — это отчет об активных кадрах стека в «определенном момент времени во время выполнения программы». Он также известен как «обратная трассировка стека» или «обратная трассировка стека».

Итак, поскольку он использует TraceBack, он хранит информацию обо всех местоположениях, прослеженных до места назначения, т. е. того места, где вы вызвали функцию «.getStackTrace()»,

в первом сценарии выше он был вызван в методе 3, поэтому он будет содержать трассировку всех местоположений (Источник: основной) до метода 3.

  • основной->метод1->метод2->метод3

во втором сценарии выше, где он вызывается в основной функции, печатается только трассировка основной функции

  • основной

Я поделился информацией, насколько мне известно, и было бы здорово, если бы кто-нибудь сообщил мне, где, если я ошибаюсь.

Другие вопросы по теме