不久前我看到一个博客,说如果您在使用concurrentmodificationexception
时遇到问题,请将arraylist转换为常规array [],就可以了。它没有解释它。
为什么是这样?
最佳答案
此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间以任何方式对列表进行结构修改,则除了通过迭代器自己的remove或add方法之外,迭代器都会抛出。
请注意,此异常并不表示该对象已被其他线程同时修改。即使有一个线程违反了对象的合同,也会引发异常。
在Java中,尝试在Iterator之外修改Collections对象ConcurrentModificationException
时,可能会发生ConcurrentModificationException。该文档指出可能是线程引起的,但是即使执行单线程编程,也可以获取此异常。
以下代码尽管在单个线程中执行,但仍引发(ex, java.util.List)
。
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
}
mylist上的
ConcurrentModificationException
调用会干扰迭代器的处理。迭代时删除项目的正确方法是使用remove()
的java.util.Iterator
方法(这与remove()
不同。如果您维护应用程序并看到此异常,则该错误可能不像前面的代码块那样容易检测到。查找所有remove()调用,并确保它们都在迭代器外部(如在带索引的for循环中)或在迭代器
java.util.List.remove(int))
中调用IllegalStateException
一个相关的错误是IllegalStateException。如果您没有在remove()之后推进迭代器,则会发生这种情况。
iterator.next();
iterator.remove();
iterator.remove(); // will throw the error
保持迭代器指针为最新,使用
(using iterator.remove()).
一次操作一个元素;这是来自Here.