Я очень новичок в программировании. Я пытаюсь учиться в 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()
{
}
}
getStackTrace()
возвращает фактический стек, во втором примере кода методы еще не были выполнены, поэтому их нет в стеке (StackTraceElement добавляется в текущий стек при вызове каждого метода и удаляется после возврата из этого вызова метода)
Почему трассировка стека, созданная во втором примере, должна содержать method1()
? Ваш метод main
вызывает множество методов: currentThread()
, getStackTrace()
, getMethodName()
, println(…)
и method1()
. Почему трассировка стека должна содержать method1()
, а не какой-либо другой метод? На вопрос «Где я?» есть ответ. без двусмысленности, а не на вопросы типа «Где я был?» или «Где я буду?»
Прекрасные милые люди, спасибо за Вашу помощь. Кажется, я наконец понял, но это далось нелегко. Поправьте меня, если я ошибаюсь, но «читает» ли объект stackTraceELement все методы, которые использовались до этого момента? Так вот почему, когда я использую его в основном методе, он просто читает только этот метод, потому что все остальные методы еще не запущены? Сначала для меня это было неочевидно, так как я думал, что основной метод "знает" все, что происходит в программе, от начала до конца рабочей программы.
Трассировка стека — это отчет об активных кадрах стека в «определенном момент времени во время выполнения программы». Он также известен как «обратная трассировка стека» или «обратная трассировка стека».
Итак, поскольку он использует TraceBack, он хранит информацию обо всех местоположениях, прослеженных до места назначения, т. е. того места, где вы вызвали функцию «.getStackTrace()»,
в первом сценарии выше он был вызван в методе 3, поэтому он будет содержать трассировку всех местоположений (Источник: основной) до метода 3.
во втором сценарии выше, где он вызывается в основной функции, печатается только трассировка основной функции
Я поделился информацией, насколько мне известно, и было бы здорово, если бы кто-нибудь сообщил мне, где, если я ошибаюсь.
Потому что стек заполняется во время выполнения. Если вы проверили трассировку стека в
main
, как среда выполнения узнает, что произойдет в цепочке методов? Откуда ему знать, например, чтоmethod1
абсолютно точно вызоветmethod2
и что JVM не выйдет из строя до того, как она будет вызвана?