2017-09-13 4 views
0

私は現在JFreeChatを使っていくつかのチャートをJavaで描画しています。実際の図面は非常に大きなプロジェクトの一部ですが、私は簡単にコードを追加することはできません。私には、ExceptionがJFreeChartコンポーネントから直接
にスローされたようです。誰かを助けることができたら本当に感謝します。正確にどこに例外がスローされたのかを詳細に追跡する方法はありますか?私は、リストの反復のようなケースでは例外が一般的にスローされ、同時に同じリストから要素を削除していることを読んでいます(これは私が今やっていることではありません)。JFreeChartはjava.util.ConcurrentModificationExceptionをスローします

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException 
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) 
    at java.util.ArrayList$Itr.next(ArrayList.java:851) 
    at org.jfree.chart.plot.XYPlot.drawAnnotations(XYPlot.java:3972) 
    at org.jfree.chart.plot.XYPlot.draw(XYPlot.java:3339) 
    at org.jfree.chart.JFreeChart.draw(JFreeChart.java:1229) 
    at org.jfree.chart.ChartPanel.paintComponent(ChartPanel.java:1624) 
    at javax.swing.JComponent.paint(JComponent.java:1056) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579) 
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502) 
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:306) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1272) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5158) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4969) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:831) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:814) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738) 
    at javax.swing.RepaintManager.access$1200(RepaintManager.java:64) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

答えて

1

を反復います。 IDEでこれを再現できる場合は、この例外がスローされたときにブレークポイントを設定し(VM内のすべてのスレッドを一時停止する)、例外が発生したときに他のスレッドを検査します。

Eclipse Conditional-Breakpoint. How to check if exception occurs?

+0

はい、データソースとして使用されているコレクションが、チャートが繰り返し処理されている間に別のスレッドによって変更されているようです。 –

+0

私はJFreeChartをバージョン1.0.19で使用しています。繰り返し中に変化するコレクションを識別することができませんでした。 – Tauling

1

を参照してくださいこの質問を参照してください:ここでの問題は似ている

How to avoid "ConcurrentModificationException" while removing elements from `ArrayList` while iterating it?

を。スタックトレース内のArrayListが同時に操作されています。上記の質問は要素の削除に関係していますが、複数のスレッドによる同時操作はこれを引き起こします。 ArrayListはスレッドセーフではありません。

を見て価値があるもう一つの問題:これはあなたのArrayListをされていない場合 How do I make my ArrayList Thread-Safe? Another approach to problem in Java?

は、それはあなたが呼んでいるものは何でもコードのバグかもしれません。

2

バージョン1.0.19の3922行目のdrawAnnotations()のソースはhereです。それは目立たず正常に機能します。誤って最上位のコンテナを表示させたり、initial threadのプロットのデータセットを更新したりすると、問題が発生する可能性があります。結果の更新イベントはevent dispatch threadで実行され、競合状態に陥る可能性があります。 Swingでは、Swing GUIオブジェクトを構築して操作する必要があります。event dispatch threadにしかありません。誤ったコードが明らかでない場合は、hereの方法で潜在的な違反を検出してください。

関連する問題