Warum gibt der Eclipse-Debugger den Fehler "Quelle nicht gefunden" scheinbar ohne Grund aus?

Beim Debuggen in Eclipse kommt es häufig vor, dass der Debugger abstürzt und die Fehlermeldung "Quelle nicht gefunden" (unter der sich eine Schaltfläche mit dem Text "Quellensuchpfad bearbeiten" befindet) angezeigt wird. Ich habe vorher im Internet nach einer Erklärung / Lösung für dieses Problem gesucht, aber nichts gefunden, was mir helfen könnte.

Jetzt habe ich jedoch herausgefunden, was in meinem Fall passiert: Der Fehler tritt auf, wenn Sie zeilenweise durch den Code und dann aus einem Block mit laufendem Code herausgehen. Ich kenne die Terminologie nicht, aber ich vermute, dass viele Anwendungen irgendwann in den "Standby-Modus" wechseln, in dem derzeit kein Code ausgeführt wird. Ein Beispiel ist eine grafische Anwendung, die auf einen Mausklick wartet. Das Anhalten an einem Haltepunkt in einer MouseListener-Methode und das anschließende Verlassen dieser Methode (in den "Standby-Modus") verursachen in meinem Fall den Fehler.

Ich habe eine MWE am Ende dieser Frage geliefert. Der Fehler tritt auf, wenn ich einen Haltepunkt an der Linie platziere

System.out.println("You clicked!");

und mit F6 zeilenweise aus der Methode aussteigen ("Step Over"). Wenn ich in der letzten Zeile des Listeners F8 ("Resume") anstelle von F6 drücke, stürzt der Debugger nicht ab und alles ist in Ordnung.

Meine Frage ist: Warum macht Eclipse etwas so Schweres, dass es in diesem Fall abstürzt? Ich verstehe, dass es keine Zeile im Quellcode gibt, in die die Programmsteuerung "springen zu" kann, nachdem der Listener im folgenden Beispiel verlassen wurde, aber warum nicht einfach in den "Standby-Modus" wechseln, ohne sich zu beschweren? Kann ich diesen Fehler irgendwie deaktivieren, um zu verhindern, dass meine Debugsitzungen so häufig vorzeitig beendet werden? Oder muss ich nur daran denken, F8 anstelle von F6 zu drücken, wenn letzteres einen Absturz verursachen würde?

package app;

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;


public class TestFrame extends JFrame {
    public TestFrame() {
        getContentPane().setPreferredSize(new Dimension(200, 200));
        getContentPane().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("You clicked!");
            }
        });
        pack();
    }

    public static void main(String[] args) {
        JFrame testFrame = new TestFrame();
        testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        testFrame.setVisible(true);
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage