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 要素が含まれており、これが and で直接使用されaddAttribute()Hashtable.put()NPE が発生します。

したがって、私の意見では、何か悪いことが起こり得る唯一の場所はドキュメント内です。この JTextComponent にカスタム Document を使用しているかどうかを確認し、内部で正確に何が行われているかを確認してください。

全体をなぞってみると、ここでしか問題にならないからです。イベント処理とキャレットの更新には影響はありません。通常の更新です。後の部分は、渡されたオブジェクトを使用した結果のみです。そのため、重要なポイントはドキュメントにあるようです。

于 2010-04-08T15:31:34.840 に答える
0

Swing Event Dispatch Thread でのみドキュメントを更新していることを確認してください。

于 2010-04-21T20:45:01.807 に答える