2

有没有人见过这样的异常(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 应用程序中。它很少发生,应用程序非常复杂。

我知道仅显示此堆栈跟踪有点远,但我想我会尝试。

4

2 回答 2

1

我从中唯一能看到的是,插入符号下的元素的 InputAttribute 已经插入了一个“null”。

我的意思是,通过检查这些类的来源,我认为问题出现在这一点上:

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

从源头来看,此时编辑器工具包ElementDocument.

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不是 null,但它的属性列表包含一个 null 元素,然后直接在addAttribute()and中使用Hashtable.put(),导致 NPE。

所以在我看来,唯一可能发生坏事的地方是在文档中。检查您是否为此 JTextComponent 使用自定义文档,并确保检查内部的具体操作。

因为从整个事情的追踪来看,只能是这个地方出问题了。事件处理和插入符号更新对其没有影响,它只是定期更新。之后的部分只是结果,使用传递的对象。所以看起来关键点在文档中。

于 2010-04-08T15:31:34.840 回答
0

确保在 Swing 事件调度线程上更新文档。

于 2010-04-21T20:45:01.807 回答