Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么下面使用迭代器next()和remove()的代码会抛出ConcurrentModificationException?_Java_Iterator - Fatal编程技术网

Java 为什么下面使用迭代器next()和remove()的代码会抛出ConcurrentModificationException?

Java 为什么下面使用迭代器next()和remove()的代码会抛出ConcurrentModificationException?,java,iterator,Java,Iterator,我测试了Iterator接口的next()和remove()方法。我得到了以下例外: 线程“main”java.util.ConcurrentModificationException中出现异常 这是我的密码: import java.util.*; public class ListTest { public static void main(String[] args) { Collection<Integer> list = new ArrayList

我测试了
Iterator
接口的
next()
remove()
方法。我得到了以下例外:

线程“main”java.util.ConcurrentModificationException中出现异常

这是我的密码:

import java.util.*;

public class ListTest {
    public static void main(String[] args) {
        Collection<Integer> list = new ArrayList<Integer>();
        Iterator<Integer> iterator = list.iterator();

        Collections.addAll(list, 1, 2, 3, 4, 5);
        if (iterator.hasNext()) {
            iterator.next();
            iterator.remove();
        }

        System.out.println(list);
    }
}
import java.util.*;
公共类列表测试{
公共静态void main(字符串[]args){
集合列表=新的ArrayList();
迭代器迭代器=list.Iterator();
集合.addAll(列表,1,2,3,4,5);
if(iterator.hasNext()){
iterator.next();
iterator.remove();
}
系统输出打印项次(列表);
}
}

使用
迭代器的
next()
remove()
没有问题

您的
ConcurrentModificationException
是在创建
迭代器后向
列表添加元素造成的

在创建
迭代器之前,应将元素添加到
列表中

更改:

Iterator<Integer> iterator = list.iterator();
Collections.addAll(list, 1, 2, 3, 4, 5);
Iterator Iterator=list.Iterator();
集合.addAll(列表,1,2,3,4,5);
致:

Collections.addAll(列表,1,2,3,4,5);
迭代器迭代器=list.Iterator();

循环将正常工作。

出现此异常是因为您在创建迭代器后通过添加元素修改了
列表的状态,因此在迭代器上调用
next()
时,在内部,它检查基础
列表
是否已修改,如果已修改,则会引发
ConcurrentModificationException

尝试将顺序反转为下一步:

Collections.addAll(list, 1, 2, 3, 4, 5);
Iterator<Integer> iterator = list.iterator();
Collections.addAll(列表,1,2,3,4,5);
迭代器迭代器=list.Iterator();

可能最好以重复的方式结束,因为这里的答案完全没有解释异常情况。@DenysSéguret你是对的,我在答案中添加了更多细节来解释一点more@NicolasFilotto现在你回答这个问题:)@DenysSéguret这是如此忘恩负义的一面,如果你花太多时间回答问题,你会得到更少的选票,有时最好先提供一个快速而肮脏的答案,然后再改进我根本不回答,然后投票以重复的形式结束,因为他们已经回答得很好了。。。我不认为复制内容有什么意义。
Collections.addAll(list, 1, 2, 3, 4, 5);
Iterator<Integer> iterator = list.iterator();