2012-01-27 45 views
-1

以下几段代码几乎每次调用时都会引发ConcurrentModificationException。第二段代码不会抛出异常,但它不是我需要的正确逻辑。如果对象是EditorFrame的实例,则需要调用自定义处置策略,这是close()方法的作用。但是,如果它只是一个基本框架,我希望它叫dispose()Java - ConcurrentModificationException

我环顾了这个网站,并按照一些说明,但没有发现我的工作。

抛出异常的代码:

synchronized (frameList) { 
    for (Iterator<JFrame> it = frameList.iterator(); it.hasNext();) { 
     JFrame frame = it.next(); 
     if (frame instanceof EditorFrame) ((EditorFrame) frame).close(); 
     else frame.dispose(); 
     it.remove(); 
    } 
} 

此代码的工作,但它不是我想要的东西:

synchronized (frameList) { 
    for (Iterator<JFrame> it = frameList.iterator(); it.hasNext();) { 
     JFrame frame = it.next(); 
     frame.dispose(); 
     it.remove(); 
    } 
} 

感谢您的帮助!

+5

您是否在'EditorFrame.close'方法修改'frameList'? (当前线程将锁定'frameList',锁是可重入的,不应该需要锁,因为Swing只能用于事件调度线程(EDT)。) – 2012-01-27 00:19:22

+0

您可以发布EditorFrame类吗? – 2012-01-27 00:24:33

+0

同意Tom Hawtin:你应该只在单线程EDT上执行此代码,所以不应该需要同步。哪条线通过这种方式抛出异常?此外,所有if/else块,for循环,拍摄任何代码块都应该用大括号括起来以避免模糊。 – 2012-01-27 00:43:15

回答

6

没有进入究竟是什么导致ConcurrentModificationException。您仍在移除每个对象frameList

为什么在完成迭代列表后,您没有明确地清除列表。

synchronized (frameList) { 
    for (JFrame frame : frameList) { 
     if (frame instanceof EditorFrame) ((EditorFrame) frame).close(); 
     else frame.dispose(); 
    } 
    frameList.clear(); 
} 
相关问题