带vector和clear()的ConcurrentModificationException

时间:2011-05-18 13:11:05

标签: java vector

我有一个非常简单的代码片段,用于填充向量,遍历它,然后清除它。这基本上就是我原则上的尝试:

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 个答案:

答案 0 :(得分:6)

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

如果您在迭代时修改集合,则可能会发生此ConcurrentModificationException

  

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

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

  

请注意,此实现返回的列表迭代器将抛出UnsupportedOperationException以响应其remove,set和add方法,除非列表的remove(int),set(int,Object)和add(int,Object)方法是重写的。

(实际上AbstractList.listIterator(int); Vector的文档并没有重新定义它。)

答案 1 :(得分: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样式(实际的迭代器对象对你来说是隐藏的)。

don't use Vector !!!请改用ArrayList