Debugging von Java-Code: von „Warum funktioniert es nicht?“ bis „Ich habe den Prozess im Griff“
\n\nJeder Java-Entwickler kennt dieses Gefühl: Sie starten die Anwendung, sie stürzt mit einer NullPointerException ab, und der Stack-Trace führt ins Nichts. Oder, noch schlimmer, der Code funktioniert, liefert aber völlig andere Ergebnisse als erwartet. Kommt Ihnen das bekannt vor? Willkommen in der Welt des Debuggings. Es ist nicht nur die Suche nach Fehlern – es ist die Kunst zu verstehen, was Ihr Programm tatsächlich tut.
In diesem Artikel schauen wir uns an, wie Sie Java-Code wie ein Profi debuggen. Sie erfahren etwas über fortgeschrittene Techniken, die Ihnen Stunden an Nerven sparen, und über Werkzeuge, die das Debugging von einer lästigen Pflicht in eine spannende Detektivarbeit verwandeln. Los geht's!
\n\n1. Die Basis: Breakpoint – Ihr bester Freund
\n\nBeginnen wir mit dem Offensichtlichsten: den Haltepunkten. Aber blättern Sie nicht gleich weiter – Sie werden überrascht sein, wie viele Entwickler nur 10 % ihrer Möglichkeiten nutzen.
\n\n1.1. Zeilen-, bedingte und Ausnahme-Breakpoints
\n\nIn IntelliJ IDEA (und anderen modernen IDEs) gibt es drei grundlegende Typen:
\n\n- \n
- Zeilen-Breakpoint – wird auf eine Codezeile gesetzt. Das Programm hält jedes Mal an, wenn es diese Zeile erreicht. \n
- Bedingter Breakpoint – Sie geben eine Bedingung vor (z. B.
i == 5). Der Halt erfolgt nur, wenn die Bedingung wahr ist. Das rettet einen in Schleifen mit einer Million Iterationen. \n - Ausnahme-Breakpoint – fängt den Moment ein, in dem eine bestimmte Ausnahme ausgelöst wird (z. B.
NullPointerException). Er wird nicht auf eine Zeile, sondern auf einen Fehlertyp gesetzt. Sehr nützlich, wenn die Ausnahme irgendwo tief in einer Bibliothek auftritt. \n
Beispiel für das Setzen eines bedingten Breakpoints:
\n\npublic class Main {\n public static void main(String[] args) {\n for (int i = 0; i < 100; i++) {\n // Breakpoint setzen, Bedingung: i == 42\n System.out.println("Iteration: " + i);\n }\n }\n}\n\nWenn die Schleife die 42. Iteration erreicht, hält der Debugger an. Die anderen 99 Male läuft er ohne Unterbrechung durch.
\n\n1.2. Watchpoints: Felder überwachen
\n\nSie müssen herausfinden, wer und wann den Wert eines Feldes ändert? Verwenden Sie einen Watchpoint (Beobachtungspunkt). Sie setzen ihn auf ein Klassenfeld, und der Debugger hält bei jedem Lesen oder Schreiben dieses Feldes an.
\n\npublic class User {\n private String name; // Watchpoint auf dieses Feld setzen\n\n public void setName(String name) {\n this.name = name; // Halt hier\n }\n\n public String getName() {\n return name; // Oder hier, wenn der Lesemodus aktiviert ist\n }\n}\n\n2. Java-Debugging-Werkzeuge: Was im Arsenal sein sollte
\n\nDie gute Nachricht: Sie benötigen keine externen Tools, wenn Sie eine moderne IDE haben. Aber deren Möglichkeiten zu kennen, ist ein Muss.
\n\n2.1. IntelliJ IDEA Debugger: Versteckte Funktionen
\n\nHier sind einige Funktionen, die das Debugging von Java-Code zum Vergnügen machen:
\n\n- \n
- Drop Frame (Schaltfläche in Form eines Abwärtspfeils) – ermöglicht es, die Ausführung zur vorherigen Methode im Aufrufstapel „zurückzusetzen“. Sie ändern den Programmzustand nicht, können aber die Logik erneut durchgehen. Unverzichtbar, wenn Sie einen wichtigen Schritt verpasst haben. \n
- Evaluate Expression (Alt+F8) – Sie können während des Debuggens beliebigen Code ausführen. Möchten Sie wissen, was
list.size()zurückgibt? Oder sogar den Wert einer Variablen im laufenden Betrieb ändern? Bitte sehr. \n - Hot Swap (heiße Code-Auswechslung) – haben Sie eine Methode geändert und möchten sie ohne Neustart testen? IntelliJ IDEA unterstützt den heißen Austausch von Klassen. Funktioniert nicht für alle Änderungen (z. B. kann kein neues Feld hinzugefügt werden), aber für den Methodenrumpf ist es ideal. \n
2.2. Alternativen: Eclipse, VS Code und JDB
\n\nWenn Sie Eclipse verwenden, gibt es dort ähnliche Funktionen: die Display-Ansicht für Ausdrücke und Drop to Frame. In VS Code mit Java Ex