我看到一个博客而回是说,如果你遇到麻烦concurrentmodificationexception
,转换ArrayList的到正规的[]数组,你会没事的。 它没有,虽然解释。
为什么是这样?
我看到一个博客而回是说,如果你遇到麻烦concurrentmodificationexception
,转换ArrayList的到正规的[]数组,你会没事的。 它没有,虽然解释。
为什么是这样?
此类的iterator和listIterator方法返回的迭代器是快速失败的:如果列表在任何时间从结构上修改创建迭代器之后,以任何方式,除了通过迭代器自身的remove或add方法,迭代器都将抛出ConcurrentModificationException
。
请注意,此异常并不表明对象已经由不同线程并发修改。 抛出异常,甚至一个线程被侵犯对象的合同。
在Java中,一个可以ConcurrentModificationException的尝试修改类别对象时发生(ex, java.util.List)
的迭代之外。 该文件指出线程作为一个可能的原因,但你可以得到这个例外,甚至做的单线程程序。
下面的代码抛出一个ConcurrentModificationException
,尽管在单个线程执行。
List<String> mylist = new ArrayList<String>();
mylist.add("one");
Iterator<String> iterator = mylist.iterator();
while( iterator.hasNext() ) {
iterator.next();
mylist.remove(0); // throws the exception
}
该remove()
的调用MYLIST使用迭代器处理干扰。 而迭代是使用正确的方式来删除项目java.util.Iterator
的remove()
方法(这是比不同java.util.List.remove(int))
如果你保持一个应用程序,看到这个异常,机会是错误是不容易发现的前面的代码块。 寻找所有的remove()调用,并确保它们都被称为一个迭代器外(如在与索引循环)或迭代器中(using iterator.remove()).
IllegalStateException
一个相关的错误是一个IllegalStateException。 如果你没有一个删除后推进迭代器可能发生这种情况()。
iterator.next();
iterator.remove();
iterator.remove(); // will throw the error
保持迭代器指针电流,在与时间上操作的一个元件next() or remove()
; 这是来自这里。
当您add
或remove
从一个元素ArrayList
,您将更改其结构。 这将违反对iterator
这是这一变化之前进行初始化。
阵列,在另一方面,没有真正的迭代器。 myArray[i] = myValue
仅仅是一个分配-它无助于阵列的结构,并且是原子的,像任何其他分配。