Как найти исключение в свинге
У меня проблема с Java-свингом. иногда я получаю это NullPointerException в случайное время (возможно, при каком-то методе рисования?): (в проекте более 100 классов, поэтому нет смысла размещать здесь код, более того, меня интересует правильный подход для поиска такого типа excp. это не в моем исходном коде)
Исключение в потоке "AWT-EventQueue-0" java.lang.NullPointerException в javax.swing.plaf.basic.BasicTextUI$RootView.paint(неизвестный источник) в javax.swing.plaf.basic.BasicTextUI.paintSafely(неизвестный источник) javax.swing.plaf.basic.BasicTextUI.paint(неизвестный источник) на javax.swing.plaf.basic.BasicTextUI.update(неизвестный источник) на javax.swing.JComponent.paintComponent(неизвестный источник) на javax.swing.Jom. краска (Неизвестный источник) в javax.swing.JComponent.paintToOffscreen(Неизвестный источник) в javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Неизвестный источник) в javax.swing.RepaintManager$PaintManager.paint(Неизвестный источник) в javax.RepaintManager.paint(неизвестный источник) на javax.swing.JComponent._paintImmediately(неизвестный источник) на javax.swing.JComponent.paintImmediately(неизвестный источник) на javax.swing.RepaintManager.paintDirtyRegions(неизвестный источник) на javax.RepMax paintDirtyRegions (неизвестный источник) в javax.swing.RepaintManager.seqPaintDirtyRegions(неизвестный источник) в javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(неизвестный источник) в java.awt.event.InvocationEvent.dispatch(неизвестный источник) в java.awt.EventQueue.dispatchEventImpl(неизвестный источник) в java.awue.cess$ (Неизвестный источник) в java.awt.EventQueue$1.run(Неизвестный источник) в java.awt.EventQueue$1.run(Неизвестный источник) в java.security.AccessController.doPrivileged(собственный метод) в java.security.AccessControlContext$1.doIntersectionPriile (Неизвестный источник) по адресу java.awt.EventQueue.dispatchEvent(Неизвестный источник) по адресу java.awt.EventDispatchThread.pumpOneEventForFilters(Неизвестный источник) по адресу java.awt.EventDispatchThread.pumpEventsForFilter(Неизвестный источник) (неизвестный источник) Источник) на java.awt.EventDispatchThread.pumpEvents(неизвестный источник) на java.awt.EventDispatchThread.pumpEvents(неизвестный источник) на java.awt.EventDispatchThread.run (неизвестный источник).
Теперь мой вопрос: как / где мне начать поиск? Я понятия не имею, почему это исключение. появляется. кроме приходит в случайное время, что также затрудняет поиск.
Итак, есть ли у кого-нибудь идея, с чего начать (или это, возможно, проблема с колебаниями, не вызванная мной)?
2 ответа
Если ошибка иногда возникает и связана с Swing, я думаю, что всегда возникает проблема с многопоточностью Swing, например, изменение или доступ компонентов Swing в другом потоке, а не в EDT. Это может вызвать исключение в EDT, поскольку Swing не является потокобезопасным (дополнительную информацию см. В руководстве по параллелизму в Swing).
Хорошим началом проверки на нарушения потоков Swing является установка кастома RepaintManager
, как объясняется в этой статье
Я изложил больше подходов в своем ответе на связанный вопрос.
Когда у меня возникают проблемы с определением того, какой компонент вызывает исключение, я помещаю ExceptionBreakpoint в Eclipse и, когда появляется исключение, я анализирую стек вызовов.
Это помогает мне в определении проблем, но я использую эту технику в контексте Java EE, я не знаю, можно ли ее применить в Swing.