不久前我看到一个博客,说如果您在使用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.

10-05 18:24
查看更多