javax.swing.text.SimpleAttributeSet.addAttribute中的NullPointerException

javax.swing.text.SimpleAttributeSet.addAttribute中的NullPointerException,java,swing,nullpointerexception,addattribute,Java,Swing,Nullpointerexception,Addattribute,有没有人见过这样的异常(JVM的1.6.011版) 发生这种情况时,JTextComponent刚刚被点击(当然不是每次点击它时都会发生) 我希望我能告诉你一个简单的复制方法,但我不能。它发生在我维护的JavaSwing应用程序中。这种情况很少发生,而且应用程序相当复杂 我知道仅仅显示这个堆栈跟踪有点困难,但我想我还是试试看。从中我唯一能看到的是,在插入符号下插入了一个“null”作为元素的InputAttribute 我的意思是,通过检查这些类的来源,我认为问题出现在这一点上: javax.s

有没有人见过这样的异常(JVM的1.6.011版)


发生这种情况时,JTextComponent刚刚被点击(当然不是每次点击它时都会发生)

我希望我能告诉你一个简单的复制方法,但我不能。它发生在我维护的JavaSwing应用程序中。这种情况很少发生,而且应用程序相当复杂


我知道仅仅显示这个堆栈跟踪有点困难,但我想我还是试试看。

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

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

javax.swing.text.StyledEditorKit.createInputAttributes(null:-1)
javax.swing.text.StyledEditorKit$AttributeTracker.updateInputAttributes(null:-1)
此时,编辑器工具包将从源代码中从
文档
中恢复当前的
元素

StyledEditorKit摘录:

元素
不是空的,但其属性列表包含一个空元素,该元素随后直接用于
addAttribute()
Hashtable.put()
,导致NPE

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


因为从追踪整个事件来看,这只会是一个问题。事件处理和插入符号更新对它没有影响,它只是一个常规更新。后面的部分是唯一的结果,使用传递的对象。因此,关键点似乎在文档中。

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

有趣的是,stacktrace中没有源代码行。您是如何以及在哪里执行它的?您使用的是什么JVM?乍一看,这似乎是一个并发问题。这个应用程序是在考虑多线程/线程安全性的情况下编写的吗?我使用的是JVM的1.6.0_11版本。发生这种情况时,你在那个TextComponent上做什么?我们可以看到设置代码的位置吗?刚刚单击了JTextComponent。通过JTextComponent的文档,您是指JTextComponent.model的值吗?这恰好是javax.swing.text.DefaultStyledDocument的一个实例。@Paul-好的,那我就不知道了。检查正在访问/修改此文档的内容,可能是。遗憾的是,我的演示是平铺的:)在这一行之后:Document aDoc=c.getDocument();aDoc是一个javax.swing.text.DefaultStyledDocument.,所以我猜它不是一个自定义文档。@Paul-我的意思是如果它只是简单地设置在那里,或者如果在程序中的某个地方访问了这个文档,例如显式地设置样式,等等。可能有问题。是的,我们是显式地设置样式。
javax.swing.text.StyledEditorKit.createInputAttributes(null:-1)
javax.swing.text.StyledEditorKit$AttributeTracker.updateInputAttributes(null:-1)
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());
}