Veremnyom – 1

"Szia! Ma elmondom, mi az a veremnyom. De először el kell mondanom, mi az a verem."

"Képzeljen el egy halom papírt – utasításokat egy bizonyos alkalmazotthoz. Új feladatot rakhat a kupac tetejére, vagy átvehet egy feladatot a tetejéről. Ez azt jelenti, hogy a feladatok nem a beérkezés sorrendjében lesznek végrehajtva. . A halomra utoljára helyezett feladat lesz az első végrehajtás. Egy gyűjtemény elemeinek így strukturálása egy verem keletkezik . "

" A Java-nak van erre egy speciális gyűjteménye – Stack . Ez egy olyan gyűjtemény, amely rendelkezik az "elem hozzáadásának" és az "elem elvételének (levételének)" módszereivel. Amint azt már sejtette, az utoljára hozzáadott elem lesz az első elviszik."

– Eléggé egyenesen hangzik.

"Remek. Most elmagyarázom, mi az a veremnyom ."

"Képzeljük el, hogy egy Java programban az A metódus B metódusnak hívja , amely a C metódusnak hívja , ami viszont a D metódusnak hívja. A B metódusból való kilépéshez először ki kell lépnünk a C metódusból , és ehhez először ki kell lépnünk a D metódusból . viselkedése egy halomhoz hasonlít."

– Miért mondod, hogy hasonlít rá?

"Ahhoz, hogy például papírkötegünk közepén valamilyen feladathoz tudjon eljutni, először végre kell hajtania az összes, a tetején heverő feladatot."

– Van némi hasonlóság, de nem vagyok benne biztos, hogy mindent jól értek.

"Nézd. A köteg elemek halmaza. Mint a papírdarabok egy kupacban. Ahhoz, hogy a harmadik papírdarabot felülről levehesd, először el kell venned a másodikat, ehhez pedig az elsőt. mindig tud papírdarabokat rakni és elvenni, de mindig a felső papírt kell először elvenni."

"Ugyanez igaz a függvényhívásokra is. Az A módszer meghívja a B metódust , amely meghívja a C metódust . Az A- ból való kilépéshez először ki kell lépnie B- ből , ehhez pedig ki kell lépnie a C- ből ."

"Várjon. Ha jól értem, amit mond, a köteg fogalma abban áll, hogy "vegye el az utoljára hozzáadott papírt", és "csak a legutóbb megadott módszerből léphet ki". Ez igaz? "

"Igen. A függvényhívások sorozatát "hívási veremnek" vagy egyszerűen csak "veremnek" nevezik. Az utoljára meghívott függvény az első funkció, amely véget ér. Nézzünk egy példát."

Az aktuális hívásverem lekérése és megjelenítése:
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());
    }
  }
}
Eredmény:
getStackTrace
method3
method2
method1
main

"OK. Mindent értek a függvényhívásokkal kapcsolatban. De mi ez a StackTraceElement?"

"A Java gép nyomon követi az összes függvényhívást. Ehhez van egy speciális gyűjteménye – a verem. Amikor egy függvény hívja a másikat, a Java gép egy új StackTraceElement objektumot helyez a verembe. Amikor egy függvény befejeződik, az elem eltávolításra kerül. a veremből. Ez azt jelenti, hogy a verem mindig naprakész információkat tárol a „függvényhívások veremének” aktuális állapotáról .

"Minden StackTraceElement objektum információt tartalmaz a hívott metódusról. A metódus nevét különösen a getMethodName metódussal kaphatja meg ."

"A fenti példában láthatja, hogyan működik ez:

1) Megkapjuk a hívás veremét.

2) Egy for-each ciklust használunk, hogy végigmenjünk rajta. Remélem, nem felejtette el, mi az.

3) A metódusneveket kiadjuk a System.out fájlba ."

"Lenyűgöző! És nem is túl bonyolult. Köszönöm, Rishi!"