Проследяване на стека - 1

„Здрасти! Днес ще ти кажа Howво е проследяване на стек. Но първо трябва да ти кажа Howво е стек.“

„Представете си купчина documentи – указания за определен служител. Можете да поставите нова задача върху купчината or можете да вземете задача от върха. Това означава, че задачите няма да бъдат изпълнени в реда, в който са получени . Задачата, поставена на купчината най-скоро, ще бъде първата, която ще бъде изпълнена. Структурирането на елементите на колекция по този начин формира стек .

" Java има специална колекция за това – Stack . Това е колекция, която има методи за "добавяне на елемент" и "вземане (вземане) на елемент". Както може би се досещате, елементът, който е добавен последен, ще бъде първият да бъдат взети."

— Звучи доста просто.

"Страхотно. Сега ще обясня Howво е проследяване на стека ."

„Представете си, че в Java програма метод A извика метод B , който извика метод C , който от своя страна извика метод D. За да излезем от метод B , първо трябва да излезем от метод C , а за да направим това – първо трябва да излезем от метод D. Това поведението наподобява стек."

— Защо казваш, че прorча?

„За да стигнете до няHowва задача в средата на нашата купчина documentи, например, първо трябва да изпълните всички задачи, лежащи отгоре.“

— Има известно сходство, но не съм сигурен, че разбирам всичко правилно.

„Вижте. Купчината е набор от елементи. Като парчета хартия в купчина. За да вземете третото парче хартия отгоре, първо трябва да вземете второто, а за това трябва да вземете първото. винаги можеш да сложиш и вземеш парчета хартия, но винаги трябва първо да вземеш горната хартия."

„Същото важи и за извикванията на функции. Метод A извиква метод B , който извиква метод C. За да излезете от A , първо трябва да излезете от B , а за да направите това, трябва да излезете от C.

„Чакай. Ако разбирам Howво искаш да кажеш, цялата концепция за стека се свежда до „вземете парчето хартия, което е добавено последно“ и „можете да излезете само от метода, който сте въвели последно“. Това точно ли е? "

„Да. Последователността от извиквания на функции е известна като „стек за повиквания“ or просто „стек“. Последната извикана функция е първата функция, която завършва. Нека да разгледаме един пример.“

Вземете и покажете текущия стек за повиквания:
public class ExceptionExample
{
  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
3
Задача
Java Syntax,  нивоурок
Заключено
Code entry
Sometimes you don't need to think, you just need to hammer it out! As paradoxical as it may seem, sometimes your fingers will "remember" better than your conscious mind. That's why while training at the secret CodeGym center you will sometimes encounter tasks that require you to enter code. By entering code, you get used to the syntax and earn a little dark matter. What's more, you combat laziness.

"ОК. Разбирам всичко за извикванията на функции. Но Howво е това StackTraceElement?"

„Машината на Java следи всички извиквания на функции. За това има специална колекция – стека. Когато една функция извиква друга, машината на Java поставя нов обект StackTraceElement в стека. Когато функцията приключи, този елемент се премахва от стека. Това означава, че стекът винаги съхранява актуална информация за текущото състояние на „стека от извиквания на функции“ .

„Всеки обект StackTraceElement съдържа информация за извикания метод. По-специално, можете да получите името на метода, като използвате метода getMethodName .“

„Можете да видите How работи това в примера по-горе:

1) Получаваме стека на повикванията.

2) Използваме цикъл for-each, за да преминем през него. Надявам се, че не сте забравor Howво е това.

3) Извеждаме имената на методите към System.out ."

„Очарователно! И не е твърде сложно. Благодаря ти, Риши!“