Stacktrace - 1

„Hi! Heute werde ich dir erzählen, was ein Stacktrace ist. Aber zuerst muss ich dir sagen, was ein Stack ist.“

„Stell dir einen Stapel Papiere vor – Anweisungen für einen bestimmten Mitarbeiter. Du kannst eine neue Aufgabe auf den Stapel legen, oder du kannst eine Aufgabe von oben nehmen. Das bedeutet, dass Aufgaben nicht in der Reihenfolge ihres Eingangs ausgeführt werden. Die Aufgabe, die zuletzt auf den Stapel gelegt wurde, ist die erste Aufgabe, die ausgeführt wird. Strukturiert man die Elemente einer Collection auf diese Weise, dann nennt man das Stack.

„Java hat dafür eine spezielle Collection: Stack. Dabei handelt es sich um eine Collection, die Methoden zum ‚Hinzufügen eines Elements‘ und zum ‚Abrufen eines Elements‘ besitzt. Wie du vielleicht schon erraten hast, wird das zuletzt hinzugefügte Element als erstes abgerufen.“

„Klingt ziemlich unkompliziert.“

„Prima. Jetzt werde ich dir erklären, was ein Stacktrace ist.“

„Stell dir folgendes vor: Ein Java-Programm ruft in Methode A Methode B auf, die Methode C aufruft, die wiederum Methode D aufruft. Um Methode B zu verlassen, müssen wir zuerst Methode C verlassen, und dazu müssen wir zuerst Methode D verlassen. Dieses Verhalten entspricht einem Stapel (Stack).

„Inwiefern entspricht das einem Stapel?“

„Wenn du zum Beispiel an die Aufgabe in der Mitte eines Papierstapels gelangen möchtest, musst du zunächst alle Aufgaben ausführen, die darüber liegen.“

„Da gibt es sicher Ähnlichkeiten, aber ich bin mir nicht sicher, ob ich alles verstanden habe.“

„Schau mal. Ein Stack ist ein Satz von Elementen. Wie Papierblätter auf einem Stapel. Um das dritte Blatt Papier von oben zu nehmen, musst du zuerst das zweite Blatt nehmen, und dafür musst du das erste Blatt nehmen. Du kannst jederzeit Papier darauf legen und entnehmen, aber du musst immer zuerst das obere Blatt Papier nehmen.“

„Das Gleiche gilt für Funktionsaufrufe. Methode A ruft Methode B auf, die Methode C aufruft. Um A zu verlassen, musst du zuerst B verlassen, und um das zu tun, musst du C verlassen.“

„Einen Moment. Wenn ich das richtig verstehe, was du sagst, läuft das gesamte Konzept eines Stacks darauf hinaus, ‚das Blatt Papier zu nehmen, das zuletzt hinzugefügt wurde‘ und ‚du kannst nur die Methode verlassen, die zuletzt aufgerufen wurde‘. Ist das so richtig?“

„Ja. Die Reihenfolge der Funktionsaufrufe wird als ‚Call Stack‘ oder einfach als ‚Stack‘ bezeichnet. Die zuletzt aufgerufene Funktion ist die erste Funktion, die beendet wird. Sehen wir uns ein Beispiel an.“

Den aktuellen Call Stack abrufen und anzeigen:
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());
    }
  }
}
Ergebnis:
getStackTrace
method3
method2
method1
main

„Okay. Ich verstehe alles, was die Funktionsaufrufe betrifft. Aber was ist dieses StackTraceElement?“

„Die Java-Maschine verfolgt alle Funktionsaufrufe. Dafür hat sie eine spezielle Collection: den Stack. Wenn eine Funktion eine andere aufruft, legt die Java-Maschine ein neues StackTraceElement-Objekt auf den Stack. Wenn eine Funktion beendet wird, wird dieses Element aus dem Stack entfernt. Das bedeutet, dass der Stack immer aktuelle Informationen über den aktuellen Zustand des ‚Funktionsaufrufstapels‘ speichert.

„Jedes StackTraceElement-Objekt enthält Informationen über die aufgerufene Methode. Vor allem kannst du den Methodennamen mit der Methode getMethodName abrufen.“

„Im Beispiel oben siehst du, wie das funktioniert:

1) Wir rufen den Call Stack ab.

2) Wir verwenden eine for-each-Schleife, um ihn zu durchlaufen. Ich hoffe, du hast nicht vergessen, was das ist.

3) Wir geben die Methodennamen an System.out aus.“

„Faszinierend! Und auch nicht zu kompliziert. Danke, Ritschie!“