занимаюсь разработкой JAVA программы в среде Eclipse, не столько ради программы, как ради опыта (хотя программу тоже нужно, так как курсовая) причиной обращения к профессионалам на форуме, есть ошибка java.lang.StackOverflowError - переполнение стека. ситуация, в которой возникает ошибка следующая: в первом класе ClInitVisualElements хендлер для кнопки btnOperationPoint.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0){ screenManagement.AddPoint(); }}); вызывает метод AddPoint(); второго класса ClScreenManagementOperations public void AddPoint() { if (!bPointIn) visualLink.AddToLastPosition("."); } AddPoint в свою очередь выполняет проверку на наличие запятой в строке и затем выполняет вызов метода первого класса (bPointIn - переменная булевого типа) AddToLastPosition(); - метод первого класса, с которого выполнялся вызов AddPoint() public void AddToLastPosition(String Text) { String StrTemp = TfDisplayOperation.getText(); TfDisplayOperation.setText(StrTemp+Text); } тут и без ошибки понятно что рекурсия присутствует, но единичная - это последовательный вызов трех методов между двумя классами, почему то возникает дофига ошибок, которые указывают на две строки кода: ClScreenManagementOperations screenManagement = new ClScreenManagementOperations(); ссылка в первом классе на второй ClInitVisualElements visualLink = new ClInitVisualElements(); ссылка во втором классе на первый подскажите пожалуйста каким образом можно решить проблему. заранее благодарен
Ответ
Надо создавать экземпляры классов отдельно, а потом из одного в другой проставлять ссылку. Или вообще снаружи, а потом обоим сообщать ссылки на обоих. Например, как-то так
class ClInitVisualElements {
private ClScreenManagementOperations screenManager;
public void setScreenManager(ClScreenManagementOperations manager) {
screenManager = manager;
}
}
class ClScreenManagementOperations {
private ClInitVisualElements visualElements;
public void setVisualElement(ClInitVisualElements elements) {
visualElements = elements;
}
}
class Main {
public static void main(String[] args) {
ClInitVisualElements elements = new ClInitVisualElements();
ClScreenManagementOperations manager = new ClScreenManagementOperations();
elements.setScreenManager(manager);
manager.setVisualElements(elements);
}
}
Комментариев нет:
Отправить комментарий