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