NullPointerException в javax.swing.text.SimpleAttributeSet.addAttribute - PullRequest
2 голосов
/ 08 апреля 2010

Кто-нибудь когда-либо видел подобное исключение (с версией 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 ]

1 голос
/ 08 апреля 2010

Единственное, что я могу видеть из этого, это то, что "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, и обязательно проверьте, что именно делается внутри.

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

0 голосов
/ 22 апреля 2010

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

...