Проследяване на стека - 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

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

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

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

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

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

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

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

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