Почему отладчик Eclipse выдает ошибку «Источник не найден», казалось бы, без причины?
Когда я отлаживаю в Eclipse, часто случается, что отладчик вылетает, отображая сообщение об ошибке «Источник не найден» (под которым находится кнопка с текстом «Изменить путь поиска источника»). Ранее я искал в Интернете объяснение / решение этой проблемы, но не нашел мне никакой помощи.
Но теперь я выяснил, что происходит в моем случае: ошибка возникает при пошаговом прохождении кода, а затем при выходе из блока выполняющегося кода. Я не знаю терминологию, но я думаю, что многие приложения могут перейти в «режим ожидания» в какой-то момент, когда ни один из его кодов в настоящее время не работает. Одним из примеров является графическое приложение, ожидающее щелчка мышью. Остановка в точке останова в методе MouseListener, а затем выход из нее (в «режим ожидания») вызовет ошибку в моем случае.
Я поставил MWE в нижней части этого вопроса. Ошибка возникает, когда я ставлю точку останова на линии
System.out.println("You clicked!");
и шаг за шагом выходите из метода, используя F6 («Step Over»). Если я нажимаю F8 («Возобновить») вместо F6 в последней строке прослушивателя, отладчик не падает, и все в порядке.
Мой вопрос: почему Eclipse делает что-то настолько серьезное, что в этом случае происходит сбой? Я понимаю, что в исходном коде нет строки, в которой можно сказать, что элемент управления программы "шагнул" после выхода из прослушивателя в приведенном ниже примере, но почему бы просто не перейти в "режим ожидания" без жалоб? Могу ли я как-то деактивировать эту ошибку, чтобы мои сеансы отладки не встречались с их преждевременным завершением? Или я просто должен помнить, чтобы нажать F8 вместо F6, когда последний вызовет сбой?
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);
}
}