Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Рекурсия и переполнение стека

занимаюсь разработкой 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); }
}

Комментариев нет:

Отправить комментарий