#java #swing #stack-overflow #event-listener #mouselistener
#java #swing #переполнение стека #прослушиватель событий #mouselistener
Вопрос:
Я уже немного занимаюсь JFrame, и с тех пор, как я начал использовать Mouselistener (или любой eventlistner, если уж на то пошло), все будет работать гладко около 2 минут или около того. Тогда я получал бы массу повторяющихся ошибок, программа все равно выполнялась бы, но я мог бы использовать любой eventlistener. Ошибка в основном заключается в следующем: …
(не удалось вовремя перехватить верхнюю строку, но что-то вроде исключения в потоке «AWT-EventQueue-0» java.lang.StackOverflowError) (за которым следует)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282)
...
повторяется для сотен сотен строк, где mouseEntered может быть любым из eventlistners.
Я уже потратил много времени на проверку всех целых чисел, чтобы увидеть, не слишком ли они высоки (нашел одно, исправил, все еще происходит). Я также везде проверял значение, которое вызывает его self, но это не имеет особого смысла, потому что это происходит примерно через 2 минуты.
Я не думаю, что это связано с каким-либо конкретным кодом, просто скажите мне, что это значит и как я мог бы это исправить.
Комментарии:
1. Было бы полезно, если бы вы могли опубликовать код для
MouseListener
и то, как он используется.2.
I don't think is has to do with any specific code
— Откуда вы это знаете? Какие шаги отладки вы предприняли, чтобы доказать это утверждение? До тех пор у вас есть ошибка, чистая и незатейливая, и код поможет нам ее устранить. Весь ли Swing-код вызывается в EDT? Продолжается ли рекурсия? Редактировать: Фактически, я собираюсь утверждать, что рекурсия продолжается, видите вы это или нет. Опять же, ваш код ответил бы на это за нас.3. Хорошо, … Я думаю, вы решили эту проблему. Желаю удачи.
Ответ №1:
Я думаю, наиболее вероятной причиной этого является то, что вы поместили компонент в себя (прямо или косвенно).
Ответ №2:
Как отмечалось выше, у вас есть ошибка в вашем коде, чистая и простая, и пока вы не покажете нам этот код, я сомневаюсь, что мы можем делать что-либо, кроме догадок. Сказав это, я предполагаю, что вы выполняете рекурсию, возможно, неосознанно, возможно, добавляя MouseListener к компоненту GUI из самого MouseListener.
В любом случае, сделайте себе и всем нам одолжение и покажите соответствующий код, поскольку большинству из нас действительно не нравится угадывать.
Ответ №3:
У меня был похожий случай, и хотя вопрос мог бы быть сформулирован лучше, это помогло мне, потому что Hovercraft [^s] ?s дал хорошую подсказку (рекурсия).
Вероятно, такая проблема не может быть изолирована в простом коде. По крайней мере, в моем случае это произошло в сложном приложении с множеством вложенных компонентов Swing, включая JInternalFrames, обернутых в проприетарные классы и т.д.
В нашем случае, который еще не полностью решен, у нас было плохое управление прослушивателями мыши (добавлено много для каждого компонента панели для обработки одного и того же контекстного меню вместо более глобального управления), и прослушиватели добавлялись и удалялись в зависимости от операций пользователя.
В любом случае, я подозреваю, что где-то мы добавляем много слушателей (действительно много!) без надлежащего удаления. В обычных операциях нам не нужно их удалять, это делается автоматически при удалении компонента, но здесь слушатели добавляются и дополняются без удаления компонента. И переполнение стека, вероятно, является просто итерацией в очень глубоком стеке…
Я работаю над анализом кода, чтобы избежать всех этих бесполезных добавлений прослушивателя (возможно, определяя, есть ли он там, прежде чем добавлять его?). В любом случае, с крошечной вероятностью, что приведенный выше анализ может быть полезен кому-то с подобным случаем, я раскрываю его там.
Ответ №4:
По моему опыту, многократное добавление данного элемента управления к одному и тому же родительскому элементу, а затем вызов doLayout() может вызвать stackoverflow с AWTEventMulticaster, однако это может быть только ошибкой в конкретной версии java. (jdk_1.6.18) И эта операция повторного добавления может показаться бессмысленной, но была побочным эффектом повторного использования компонентов.
AWTEventMulticaster используется для распространения перемещения / изменения размера элемента управления и обработки ключевых событий. Проверьте связанные операции.
Ответ №5:
У меня была такая же проблема… В моем коде были добавлены и удалены прослушиватели мыши для экземпляра объекта динамически, но это было сделано неправильно… Следствием было то, что это привело к той же ошибке, что вы описываете. После удаления добавления и удаления прослушивателей мыши все вернулось к нормальной работе. Очевидно, что решение этой проблемы заключается в правильном добавлении и удалении прослушивателей.
сплетни-автоматизация.