2011-05-18 57 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不重新定義。)