2010-04-08 1 views
2

Кто-нибудь когда-нибудь видел исключение, как это (с версии 1.6.0_11 в JVM) ?:NullPointerException в javax.swing.text.SimpleAttributeSet.addAttribute

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, которое я поддерживаю. Это происходит нечасто, и приложение довольно сложно.

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

+0

Интересно, нет строк источника в stacktrace. Как и где вы его выполняете? Какой JVM вы используете? На первый взгляд это похоже на проблему параллелизма. Разве приложение написано с многопоточным/threadafety в виду? – BalusC

+0

Я использую версию 1.6.0_11 JVM. –

+0

Что вы делали на этом TextComponent, когда это произошло? Можем ли мы увидеть код, где он настроен? –

ответ

0

Убедитесь, что вы обновляете документ только на Swing Event Dispatch Thread.

1

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

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

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.

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

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

+0

В документе для JTextComponent вы имеете в виду значение JTextComponent.model? Это случай экземпляра javax.swing.text.DefaultStyledDocument. –

+0

@Paul - Хорошо, тогда я понятия не имею. Проверьте, что может получить доступ/изменить этот документ. Жаль моей демонстрации, она падает ровно :) – Gnoupi

+0

После этой строки: \t Документ aDoc = c.getDocument(); aDoc - это javax.swing.text.DefaultStyledDocument. Поэтому я думаю, что это не пользовательский документ. –