Stapeltracering - 1

"Hallo! Vandaag zal ik je vertellen wat een stacktrace is. Maar eerst moet ik je vertellen wat een stack is."

"Stel je een stapel papieren voor - richtlijnen voor een bepaalde medewerker. Je kunt een nieuwe taak bovenop de stapel leggen, of je kunt een taak van de top nemen. Dit betekent dat taken niet worden uitgevoerd in de volgorde waarin ze zijn ontvangen ". De taak die het laatst op de stapel is geplaatst, wordt als eerste uitgevoerd. Door de elementen van een collectie op deze manier te structureren, ontstaat een stapel . "

" Java heeft daarvoor een speciale verzameling - Stack . Het is een verzameling die methoden heeft om 'een element toe te voegen' en 'een element te nemen (krijgen)'. Zoals je misschien al geraden hebt, zal het element dat als laatste is toegevoegd het eerste genomen worden."

"Klinkt vrij eenvoudig."

"Geweldig. Nu zal ik uitleggen wat een stacktracering is."

"Stel je voor dat in een Java-programma methode A methode B noemde , die methode C noemde , die op zijn beurt methode D noemde . Om methode B af te sluiten , moeten we eerst methode C afsluiten , en om dat te doen - moeten we eerst methode D afsluiten . Dit gedrag lijkt op een stapel."

'Waarom zeg je dat het erop lijkt?'

"Om bijvoorbeeld een taak midden op onze stapel papieren te krijgen, moet je eerst alle taken uitvoeren die er bovenop liggen."

"Er is enige overeenkomst, maar ik weet niet zeker of ik alles goed begrijp."

"Kijk. Een stapel is een verzameling elementen. Net als stukjes papier op een stapel. Om het derde stuk papier van boven te pakken, moet je eerst het tweede pakken, en daarvoor moet je het eerste pakken. kan altijd stukjes papier leggen en pakken, maar je moet altijd eerst het bovenste papier pakken."

"Hetzelfde geldt voor functieaanroepen. Methode A roept methode B aan , die methode C aanroept . Om A te verlaten , moet je eerst B verlaten , en om dat te doen, moet je C verlaten ."

"Wacht. Als ik begrijp wat je zegt, komt het hele concept van een stapel neer op 'neem het stuk papier dat het laatst is toegevoegd' en 'je kunt alleen de methode verlaten die je het laatst hebt ingevoerd'. Klopt dat? "

"Ja. De volgorde van functieaanroepen staat bekend als de 'call stack' of simpelweg de 'stack'. De laatst aangeroepen functie is de eerste functie die eindigt. Laten we eens kijken naar een voorbeeld."

Haal de huidige call-stack op en geef deze weer:
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());
    }
  }
}
Resultaat:
getStackTrace
method3
method2
method1
main

"OK. Ik snap alles over functieaanroepen. Maar wat is dit StackTraceElement?"

"De Java-machine houdt alle functieaanroepen bij. Daarvoor heeft het een speciale verzameling: de stapel. Wanneer de ene functie een andere aanroept, plaatst de Java-machine een nieuw StackTraceElement-object op de stapel. Wanneer een functie is voltooid, wordt dat element verwijderd. Dit betekent dat de stack altijd up-to-date informatie over de huidige status van de 'stack of function calls' opslaat. "

"Elk StackTraceElement- object bevat informatie over de aangeroepen methode. U kunt met name de naam van de methode verkrijgen met behulp van de methode getMethodName ."

"Je kunt zien hoe dit werkt in het bovenstaande voorbeeld:

1) We krijgen de call-stack.

2) We gebruiken een for-each -lus om er doorheen te gaan. Ik hoop dat je niet bent vergeten wat dat is.

3) We voeren de methodenamen uit naar System.out ."

"Fascinerend! En ook niet te ingewikkeld. Dankjewel, Rishi!"