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
3
Feladat
Java Syntax,  szintlecke
Zárt
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.

"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!"