NullPointerException в javax.swing.text.SimpleAttributeSet.addAttribute

Кто-нибудь когда-либо видел подобное исключение (с версией JVM 1.6.0_11)?:

ERROR: java.lang.NullPointerException: null
    at java.util.Hashtable.put(null:-1)
    at javax.swing.text.SimpleAttributeSet.addAttribute(null:-1)
    at javax.swing.text.SimpleAttributeSet.addAttributes(null:-1)
    at javax.swing.text.StyledEditorKit.createInputAttributes(null:-1)
    at javax.swing.text.StyledEditorKit$AttributeTracker.updateInputAttributes(null:-1)
    at javax.swing.text.StyledEditorKit$AttributeTracker.caretUpdate(null:-1)
    at javax.swing.text.JTextComponent.fireCaretUpdate(null:-1)
    at javax.swing.text.JTextComponent$MutableCaretEvent.fire(null:-1)
    at javax.swing.text.JTextComponent$MutableCaretEvent.mouseReleased(null:-1)
    at java.awt.AWTEventMulticaster.mouseReleased(null:-1)
    at java.awt.AWTEventMulticaster.mouseReleased(null:-1)
    at java.awt.Component.processMouseEvent(null:-1)
    at javax.swing.JComponent.processMouseEvent(null:-1)
    at java.awt.Component.processEvent(null:-1)
    at java.awt.Container.processEvent(null:-1)
    at java.awt.Component.dispatchEventImpl(null:-1)
    at java.awt.Container.dispatchEventImpl(null:-1)
    at java.awt.Component.dispatchEvent(null:-1)
    at java.awt.LightweightDispatcher.retargetMouseEvent(null:-1)
    at java.awt.LightweightDispatcher.processMouseEvent(null:-1)
    at java.awt.LightweightDispatcher.dispatchEvent(null:-1)
    at java.awt.Container.dispatchEventImpl(null:-1)
    at java.awt.Window.dispatchEventImpl(null:-1)
    at java.awt.Component.dispatchEvent(null:-1)
    at java.awt.EventQueue.dispatchEvent(null:-1)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(null:-1)
    at java.awt.EventDispatchThread.pumpEventsForFilter(null:-1)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(null:-1)
    at java.awt.EventDispatchThread.pumpEvents(null:-1)
    at java.awt.EventDispatchThread.pumpEvents(null:-1)
    at java.awt.EventDispatchThread.run(null:-1)

Когда это происходило, на JTextComponent просто нажимали (это, конечно, происходит не каждый раз, когда вы нажимаете на него).

Я хотел бы сказать вам простой способ воспроизвести это, но я не могу. Это происходит в приложении Java Swing, которое я поддерживаю. Это случается нечасто и приложение довольно сложное.

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

2 ответа

Решение

Убедитесь, что вы обновляете документ только в потоке рассылки событий Swing.

Единственное, что я могу видеть из этого, это то, что "null" был вставлен как InputAttribute элемента под кареткой.

Я имею в виду, что, проверяя источники этих классов, я думаю, что проблема возникает в этой точке:

javax.swing.text.StyledEditorKit.createInputAttributes(null:-1)
javax.swing.text.StyledEditorKit$AttributeTracker.updateInputAttributes(null:-1)

Исходя из источника, в этот момент комплект редактора восстанавливает текущий Element от Document,

Выдержка из StyledEditorKit:

Element run;
currentParagraph = doc.getParagraphElement(start);
if (currentParagraph.getStartOffset() == start || dot != mark) {
    // Get the attributes from the character at the selection
    // if in a different paragrah!
    run = doc.getCharacterElement(start);
}
else {
    run = doc.getCharacterElement(Math.max(start-1, 0));
}
if (run != currentRun) {
    currentRun = run;
    createInputAttributes(currentRun, getInputAttributes());
}

это Element не является нулевым, но его список атрибутов содержит нулевой элемент, который затем используется непосредственно в addAttribute() а также Hashtable.put(), вызывая NPE.

Так что, на мой взгляд, единственное место, где может случиться что-то плохое, - это Документ. Проверьте, используете ли вы пользовательский Document для этого JTextComponent, и обязательно проверьте, что именно делается внутри.

Потому что от отслеживания всего этого может быть только проблема в этом месте. Обработка событий и обновление каретки не влияют на это, это просто регулярное обновление. Часть после является только следствием, используя переданный объект. Таким образом, похоже, что ключевой момент в документе.

Другие вопросы по тегам