2017-09-13 70 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显示的方法来检测潜在的违规。

相关问题