2011-05-18 61 views
3

我有一个非常简单的代码片段,填充一个向量,遍历它,然后清除它。这里基本上是我想要的原则:ConcurrentModificationException与向量和清除()

vector v = new Vector(); 
v.add(1); 
v.add(2); 
v.add(3); 
ListIterator iter = v.listIterator(); 

while (iter.hasNext()) { 
    System.out.println(iter.next()); 
} 

v.clear() 

但我得到一个ConcurrentModificationException的。

从阅读本文,显然以某种方式使用“同步”是解决方案。但是我看到了一些不同的方法,并且想知道在我的情况下解决这个问题的最好,最简单的方法是什么(没有明确的线程)?

回答

2

让我缩短的代码为您提供:

Vector<Integer> v = new Vector<Integer>(); 
v.add(1); 
v.add(2); 
v.add(3); 
for (Integer i: v) { 
    System.out.println(i); 
} 
v.clear(); 

除非你做向前和向后导航,则不应使用listIterator()。对于简单的迭代,使用iterator()方法,最好在上面展示的for-each样式中(其中实际的迭代器对象从您隐藏)。

And don't use Vector !!!改为使用ArrayList

5

如果不涉及任何线程,很可能您发布的示例不完整。

这个ConcurrentModificationException可能会发生,如果您在迭代它时修改集合。

请注意,此异常并不总是表示某个对象已被另一个线程同时修改。如果单个线程发出违反对象合约的一系列方法调用,则该对象可能会抛出此异常。例如,如果一个线程在使用快速迭代器迭代集合的同时直接修改集合,那么迭代器将会抛出这个异常。

而对于Vector.listIterator()的文档明确指出:

注意,此实现返回的列表迭代器将响应其删除,设置抛出UnsupportedOperationException和添加,除非列表的remove(INT方法),set(int,Object)和add(int,Object)方法被覆盖。

(嗯,事实上,该文档为AbstractList.listIterator(int); Vector不重新定义。)