Что вызывает бесконечную рекурсию в AWTEventMulticaster.mouseEntered ()? - PullRequest
3 голосов
/ 23 мая 2011

Я немного занимался JFrame, и с тех пор, как я начал использовать Mouselistener (или любой другой список событий), дела шли гладко в течение примерно 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 может быть любым из списков событий.

Я уже потратил много времени на проверку всех целых чисел, чтобы увидеть, не слишком ли высоки они (найдено, исправлено, все еще происходит). Я также везде проверял значение, которое вызывает само себя, но это не имеет особого смысла, потому что это происходит через 2 минуты.

Я не думаю, что это связано с каким-то конкретным кодом, просто скажите мне, что это значит и как я мог бы исправить это.

Ответы [ 5 ]

1 голос
/ 23 мая 2011

Полагаю, наиболее вероятной причиной этого является то, что вы вложили компонент в себя (прямо или косвенно).

0 голосов
/ 07 августа 2012

По моему опыту, многократное добавление данного элемента управления к одному и тому же родительскому элементу с последующим вызовом doLayout () может вызвать переполнение стека с помощью AWTEventMulticaster, однако это может быть только ошибкой в ​​конкретной версии Java. (Jdk_1.6.18) И эта операция повторного добавления может показаться бессмысленной, но побочным эффектом является повторное использование компонентов.

AWTEventMulticaster используется для распространения управляющего перемещения / изменения размера и обработки KeyEvent. Проверьте связанные операции.

0 голосов
/ 06 июля 2012

У меня была такая же проблема ... В мой код были добавлены и удалены слушатели мыши к экземпляру объекта динамически, но это было сделано неправильно ... Следствием этого стало то, что он выдал ту же ошибку, что и вы. После удаления добавления и удаления слушателей мыши все вернулось к нормальной работе. Очевидно, что решением этой проблемы является правильное добавление и удаление слушателей.

сплетен автоматизации.

0 голосов
/ 07 июня 2011

У меня был похожий случай, и хотя вопрос мог бы быть сформулирован лучше, он помог мне, потому что Hovercraft [^ s] +? S дал хороший намек (рекурсия).

Такая проблема, вероятно, не может быть изолирована простым кодом. По крайней мере, в моем случае это происходило в сложном приложении с большим количеством вложенных компонентов Swing, включая JInternalFrames, завернутые в проприетарные классы и т. Д.

В нашем случае, еще не полностью решенном, у нас было плохое управление слушателями мыши (для каждого компонента панели было добавлено множество для обработки одного и того же контекстного меню вместо более глобального управления), и слушатели были добавлены и удалены в зависимости от пользовательских операций.
Во всяком случае, я подозреваю, что где-то мы добавляем много слушателей (действительно много!), Не удаляя их должным образом. В обычных операциях нам не нужно их удалять, это делается автоматически при удалении компонента, но здесь слушатели добавляются и добавляются без удаления компонента. А переполнение стека, вероятно, просто итерация в очень глубоком стеке ...

Я работаю над анализом кода, чтобы избежать всех этих бесполезных добавлений слушателя (возможно, обнаружение, если он есть, перед его добавлением?). Как бы то ни было, приведенный выше анализ может быть полезен для кого-то с подобным случаем, я раскрываю его там.

0 голосов
/ 23 мая 2011

Как отмечалось выше, у вас есть ошибка в вашем коде, простая и простая, и пока вы не покажете нам этот код, я сомневаюсь, что мы можем сделать что-то кроме угадывания. Сказав это, мое SWA-предположение заключается в том, что вы делаете рекурсию, возможно, по незнанию, возможно, путем добавления MouseListener к компоненту GUI из самого MouseListener.

В любом случае, сделайте себе и всем нам одолжение и покажите соответствующий код, поскольку большинству из нас действительно не нравится угадывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...