Stackspår - 1

"Hej! Idag ska jag berätta vad en stack trace är. Men först måste jag berätta vad en stack är."

"Föreställ dig en hög med papper – direktiv för en viss anställd. Du kan lägga en ny uppgift ovanpå högen, eller så kan du ta en uppgift från toppen. Det betyder att uppgifter inte kommer att utföras i den ordning de togs emot . Uppgiften som placerats på högen senast kommer att vara den första som utförs. Att strukturera elementen i en samling på detta sätt bildar en stack . "

" Java har en speciell samling för det – Stack . Det är en samling som har metoder för att 'lägga till ett element' och 'ta (få) ett element'. Som du kanske har gissat kommer elementet som lades till sist att vara det första som bli tagen."

"Låter ganska okomplicerat."

"Jättebra. Nu ska jag förklara vad ett stackspår är."

"Föreställ dig att i ett Java-program heter metod A metod B , som kallade metod C , som i sin tur kallade metod D . För att avsluta metod B måste vi först avsluta metod C , och för att göra det - måste vi först avsluta metod D . beteende liknar en stack."

"Varför säger du att den liknar den?"

"För att till exempel komma till någon uppgift mitt i vår pappershög måste du först utföra alla uppgifter som ligger ovanpå den."

"Det finns en viss likhet, men jag är inte säker på att jag förstår allt rätt."

"Titta. En stapel är en uppsättning element. Som pappersbitar i en hög. För att ta den tredje pappersbiten från toppen måste du först ta den andra, och för det måste du ta den första. Du kan alltid lägga och ta bitar av papper, men du måste alltid ta det översta pappret först."

"Detsamma gäller för funktionsanrop. Metod A anropar metod B , som anropar metod C . För att avsluta A måste du först avsluta B , och för att göra det måste du avsluta C ."

"Vänta. Om jag förstår vad du menar, så går hela konceptet med en stack ner till "ta papper som lades till sist" och "du kan bara avsluta metoden du senast angav". Stämmer det? "

"Ja. Sekvensen av funktionsanrop är känd som 'anropsstacken' eller helt enkelt 'stacken'. Den sista funktionen som anropas är den första funktionen som slutar. Låt oss gräva in ett exempel."

Hämta och visa den aktuella samtalsstacken:
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. Jag får allt om funktionsanrop. Men vad är detta StackTraceElement?"

"Java-maskinen håller reda på alla funktionsanrop. För det har den en speciell samling – stacken. När en funktion anropar en annan lägger Java-maskinen ett nytt StackTraceElement-objekt i stacken. När en funktion är klar tas det elementet bort från stacken. Detta innebär att stacken alltid lagrar uppdaterad information om det aktuella tillståndet för "stacken med funktionsanrop".

"Varje StackTraceElement -objekt innehåller information om den anropade metoden. I synnerhet kan du få metodnamnet med metoden getMethodName ."

"Du kan se hur detta fungerar i exemplet ovan:

1) Vi får samtalsstacken.

2) Vi använder en för varje slinga för att gå igenom den. Jag hoppas att du inte har glömt vad det är.

3) Vi matar ut metodnamnen till System.out ."

"Fascinerande! Och inte alltför komplicerat heller. Tack, Rishi!"