Java 带有ArrayList.iterator()的ConcurrentModificationException

Java 带有ArrayList.iterator()的ConcurrentModificationException,java,Java,我有一些密码。以前是这样的, for(Shape s: shapes){ g.setColor(Color.blue); g.fill(sh); g.setColor(Color.gray); g.draw(sh); } 但是它抛出了一个ConcurrentModificationException,所以我将它改为使用这样的迭代器 Iterator<Shape> s = shapes.iterator(); while(s.hasNext()){ Shape

我有一些密码。以前是这样的,

for(Shape s: shapes){
g.setColor(Color.blue);
    g.fill(sh);
    g.setColor(Color.gray);
    g.draw(sh);
}
但是它抛出了一个ConcurrentModificationException,所以我将它改为使用这样的迭代器

Iterator<Shape> s = shapes.iterator();
while(s.hasNext()){
Shape sh = s.next();
g.setColor(Color.blue);
    g.fill(s);
    g.setColor(Color.gray);
    g.draw(s);
}
Iterator s=shapes.Iterator();
而(s.hasNext()){
形状sh=s.next();
g、 setColor(Color.blue);
g、 填充;
g、 setColor(颜色为灰色);
g、 抽签;
}

但它仍然抛出了ConcurrentModificationException。可能是因为它在绘制方法中被调用,但那是因为它是在绘制时被调用的。

它引发该异常,因为在“此处有更多代码”部分中,您正在修改(添加到或删除)
形状

如果使用迭代器,可以调用:

s.remove();

但仅此而已

您需要在此处显示更多的
更多代码,尤其是引发异常的行。这些信息非常关键。由于您不知道是什么原因导致了问题,您很容易猜错显示的代码,因此代码太多比代码太少稍微有点错误。您在
此处的更多代码
部分做什么?我们需要
此处的更多代码
。另外,看看您在迭代时是否试图更改“s”?这将抛出一个错误,除非您使用故障安全迭代器,否则希望您真正的第二个代码块不是
g.fill(s),而是
g.fill(sh)您确定这是导致异常的代码吗?你检查过你的stacktrace了吗?我怀疑你的问题在别处。1) 请发布异常的stacktrace。2) 在代码中指出哪一行引发异常。我只是将形状绘制到JPanel。检查正在从代码块调用哪些方法,看看它们在做什么,检查JPanel是否引用了您的对象,是否正在调用方法,如
addShape()
等。只有在调用
next()时才会引发CME
,但另一个线程可能修改了调用
next()
之间的集合。尝试调试代码,在修改集合的所有代码上设置断点。