Stakspor - 1

"Hej! I dag vil jeg fortælle dig, hvad et stakspor er. Men først skal jeg fortælle dig, hvad en stak er."

"Forestil dig en bunke papirer – anvisninger til en bestemt medarbejder. Du kan lægge en ny opgave oven på bunken, eller du kan tage en opgave fra toppen. Det betyder, at opgaverne ikke bliver udført i den rækkefølge, de blev modtaget. . Den opgave, der senest er placeret på bunken, vil være den første, der udføres. At strukturere elementerne i en samling på denne måde danner en stak . "

" Java har en speciel samling til det – Stack . Det er en samling, der har metoder til at 'tilføje et element' og 'tage (få) et element'. Som du måske har gættet, vil det element, der blev tilføjet sidst, være det første til at blive taget."

"Lyder ret ligetil."

"Fantastisk. Nu vil jeg forklare, hvad et stakspor er."

"Forestil dig, at metode A i et Java-program kalder metode B , som kaldte metode C , som igen kaldte metode D . For at afslutte metode B , skal vi først afslutte metode C , og for at gøre det - skal vi først afslutte metode D . adfærd ligner en stak."

"Hvorfor siger du, at det ligner det?"

"For at komme til en opgave midt i vores stak af papirer, skal du for eksempel først udføre alle de opgaver, der ligger oven på den."

"Der er en vis lighed, men jeg er ikke sikker på, at jeg forstår alt rigtigt."

"Se. En stak er et sæt elementer. Som stykker papir i en bunke. For at tage det tredje stykke papir fra toppen, skal du først tage det andet, og for det skal du tage det første. Du kan altid lægge og tage stykker papir, men du skal altid tage det øverste papir først."

"Det samme gælder for funktionskald. Metode A kalder metode B , som kalder metode C . For at afslutte A skal du først afslutte B , og for at gøre det skal du afslutte C ."

"Vent. Hvis jeg forstår, hvad du siger, koger hele konceptet med en stak ned til 'tag det stykke papir, der blev tilføjet sidst' og 'du kan kun afslutte den metode, du senest har indtastet'. Er det korrekt? "

"Ja. Sekvensen af ​​funktionskald er kendt som 'opkaldsstakken' eller blot 'stakken'. Den sidst kaldte funktion er den første funktion, der slutter. Lad os grave i et eksempel."

Hent og vis den aktuelle opkaldsstak:
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());
    }
  }
}
Resultat:
getStackTrace
method3
method2
method1
main

"OK. Jeg får alt om funktionskald. Men hvad er dette StackTraceElement?"

"Java-maskinen holder styr på alle funktionskald. Til det har den en særlig samling – stakken. Når en funktion kalder en anden, sætter Java-maskinen et nyt StackTraceElement- objekt på stakken. Når en funktion er færdig, fjernes det element. fra stakken. Det betyder, at stakken altid gemmer opdateret information om den aktuelle tilstand af 'stakken af ​​funktionskald'. "

"Hvert StackTraceElement- objekt indeholder information om den kaldte metode. Især kan du få metodenavnet ved at bruge metoden getMethodName ."

"Du kan se, hvordan dette fungerer i eksemplet ovenfor:

1) Vi får opkaldsstakken.

2) Vi bruger en for-hver- løkke til at gå igennem den. Jeg håber ikke du har glemt hvad det er.

3) Vi udsender metodenavnene til System.out ."

"Fascinerende! Og heller ikke for kompliceret. Tak, Rishi!"