Urmărirea stivei - 1

"Bună! Azi vă voi spune ce este o urmă de stivă. Dar mai întâi trebuie să vă spun ce este o stivă."

„Imaginați-vă un morman de hârtii – directive pentru un anumit angajat. Puteți pune o sarcină nouă deasupra grămezii sau puteți prelua o sarcină de sus. Aceasta înseamnă că sarcinile nu vor fi executate în ordinea în care au fost primite. . Sarcina plasată pe grămadă cel mai recent va fi prima care va fi executată. Structurarea elementelor unei colecții în acest fel formează o stivă . "

Java are o colecție specială pentru asta – Stack . Este o colecție care are metode de „adăugare un element” și „a lua (obține) un element”. După cum probabil ați ghicit, elementul care a fost adăugat ultimul va fi primul care va a fi luat."

— Sună destul de simplu.

"Genial. Acum o să explic ce este o urmă de stivă ."

„Imaginați-vă că într-un program Java metoda A a numit metoda B , care a numit metoda C , care la rândul său a numit metoda D . Pentru a ieși din metoda B , trebuie mai întâi să ieșim din metoda C și pentru a face asta – trebuie mai întâi să părăsim metoda D . Aceasta comportamentul seamănă cu o stivă.”

— De ce zici că seamănă?

„Pentru a ajunge la o sarcină în mijlocul teancului nostru de hârtii, de exemplu, mai întâi trebuie să executați toate sarcinile care se află deasupra acesteia.”

„Există o oarecare asemănare, dar nu sunt sigur că am înțeles totul corect”.

„Uite. Un teanc este un set de elemente. Ca niște bucăți de hârtie într-o grămadă. Pentru a lua a treia bucată de hârtie de sus, mai întâi trebuie să o iei pe a doua și, pentru asta, trebuie să o iei pe prima. poți oricând să pui și să ia bucăți de hârtie, dar întotdeauna trebuie să iei mai întâi hârtia de sus.”

"Același lucru este valabil și pentru apelurile de funcții. Metoda A apelează metoda B , care apelează metoda C . Pentru a ieși din A , trebuie mai întâi să ieșiți din B și, pentru a face asta, trebuie să părăsiți C ."

„Stai. Dacă înțeleg ce vrei să spui, întregul concept al unei stive se rezumă la „luați bucata de hârtie care a fost adăugată ultima” și „puteți ieși doar din metoda pe care ați introdus-o cel mai recent”. Este corect? "

„Da. Secvența de apeluri de funcții este cunoscută sub numele de „stiva de apeluri” sau pur și simplu „stiva”. Ultima funcție apelată este prima funcție care se încheie. Să cercetăm un exemplu.”

Obțineți și afișați stiva de apeluri curente:
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());
    }
  }
}
Rezultat:
getStackTrace
method3
method2
method1
main

"OK. Am totul despre apelurile de funcții. Dar ce este acest StackTraceElement?"

„Mașina Java ține evidența tuturor apelurilor de funcții. Pentru asta, are o colecție specială – stiva. Când o funcție o apelează pe alta, Mașina Java pune un nou obiect StackTraceElement pe stivă. Când o funcție se termină, acel element este eliminat . din stivă. Aceasta înseamnă că stiva stochează întotdeauna informații actualizate despre starea curentă a „stivei de apeluri de funcții” .

„Fiecare obiect StackTraceElement conține informații despre metoda apelată. În special, puteți obține numele metodei folosind metoda getMethodName .”

„Puteți vedea cum funcționează acest lucru în exemplul de mai sus:

1) Primim stiva de apeluri.

2) Folosim o buclă pentru fiecare pentru a o parcurge. Sper că nu ai uitat ce este asta.

3) Trimitem numele metodelor către System.out ."

"Fascinant! Și nici prea complicat. Mulțumesc, Rishi!"