2017-09-13 72 views
0

我目前使用JFreeChat爲了繪製一些圖表與Java。實際的繪圖是一個相當大的項目的一部分,它不允許我輕鬆地包含更多的代碼。對我來說,這個例外似乎是從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

我在版本1.0.19中使用JFreeChart,並且我無法識別在迭代時更改的集合。 – Tauling

1

請參閱此問題:

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

這裏的問題是相似的;堆棧跟蹤中的ArrayList正在同時運行。上面的問題涉及到刪除元素,但多線程的任何併發操作都會導致這種情況。 ArrayList不是線程安全的。

還有一個問題值得期待: How do I make my ArrayList Thread-Safe? Another approach to problem in Java?

如果這不是你的ArrayList中,它可能會在任何代碼要調用錯誤。

2

在版本1.0.19中第3972行的drawAnnotations()的來源可見here;它不起眼,通常功能正常。如果您無意中使頂級容器可見或更新了initial thread上的繪圖數據集,則可能會出現問題。由此產生的更新事件將在event dispatch thread上執行,可能會導致競爭狀況。 Swing要求您在event dispatch thread上構建和操作Swing GUI對象只有。如果錯誤代碼不明顯,請嘗試使用here顯示的方法來檢測潛在的違規。

相關問題