-1

Я знаю, что я должен предоставить достаточно информации для специальной ошибки. Но воспроизвести его невозможно. У меня очень многопоточная программа. У меня есть поток с бесконечным циклом while. Никакая часть программы не может прервать этот поток. Я проверяю Thread.currentThread().isInterrupted(); столько, сколько смогу. Но иногда бывает так, что поток прекращает работу с трассировки стека исключений странно, что говорит он не может преобразовать некоторый тип к Boolean в SetText mehod некоторого Lable и он указывает на следующую строку программы:Очень неясная ошибка, которая иногда прерывает мой поток в Java

JOptionPane.showMessageDialog(null, "action finished, going to the next!"); 

Я знаю, что я должен думать иначе! потому что у меня нет метки для установки текста, который выполняется в этом потоке. Фактически во всей программе я никогда не меняю никакого текста графического интерфейса. Я просто пишу на консоль. В чем проблема? Может ли это быть утечкой памяти в моем коде, или это может быть ошибка Java?

+0

Вы вызываете 'showMessageDialog' напрямую или предоставляете его работнику Swing для выполнения (или используя' invokeLater'?) – templatetypedef

+0

Непосредственно! без качелей! – Johnny

+4

Базовое правило SO: Если вы спрашиваете об исключении, ПОСЛАТЬ ПОЛНУЮ СТОРОНУЮ СТОРОНУ и код, который выдает исключение. –

ответ

3

Я думаю, проблема в том, что вы не должны ссылаться на showMessageDialog напрямую. Swing ожидает, что все операции с графическим интерфейсом пройдут через основной поток Swing, и as reported in this answer Я подозреваю, что проблема здесь в том, что проблема связана с вашим потоком (который не должен касаться непосредственно графического интерфейса) и потоком Swing (который должен обрабатывать этот).

Возможно, вы захотите рассмотреть вопрос об отмене showMessageDialog от SwingWorker или с помощью invokeLater.

Надеюсь, это поможет!

+0

Спасибо! Я пытаюсь охватить все диалоговые окна качания в очереди заданий swing, и я сообщу, будет ли ошибка видна в ближайшие дни. – Johnny

+0

Сегодня я тестировал программу много раз, и вы указали проблему правильно! invokeLater неизбежен. Теперь я думаю об обертке, которая показывает окно сообщения в новом потоке. – Johnny

Смежные вопросы