Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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 为什么从迭代器搜索输出此异常?_Java_Exception_Iterator - Fatal编程技术网

Java 为什么从迭代器搜索输出此异常?

Java 为什么从迭代器搜索输出此异常?,java,exception,iterator,Java,Exception,Iterator,尝试使用迭代器搜索特定整数时,我收到ConcurrentModificationException 我不知道它为什么在那里。我所做的任何研究都表明,当我试图在for循环中编辑列表时,这是一个例外。我没有这样做,事实上我甚至没有在迭代器中编辑列表 private ArrayList<Integer> list = new ArrayList(); private ListIterator<Integer> iterator = list.listIterator(); p

尝试使用迭代器搜索特定整数时,我收到ConcurrentModificationException

我不知道它为什么在那里。我所做的任何研究都表明,当我试图在for循环中编辑列表时,这是一个例外。我没有这样做,事实上我甚至没有在迭代器中编辑列表

private ArrayList<Integer> list = new ArrayList();
private ListIterator<Integer> iterator = list.listIterator();

public void search(int input) {
    while (iterator.hasNext()) {
        if (input == iterator.next()) {
            System.out.println(iterator.next());
       }
    } 
}

public static void main(String[] args) {
    SearchList sl = new SearchList();

    for (int i = 0; i < 10; i++) {
        sl.list.add(i);
    }

    System.out.println(sl.list);

    sl.search(6);
}
实际产量:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)
    at SearchList.search(SearchList.java:23)
    at SearchList.main(SearchList.java:38)```

初始化类实例时创建迭代器,然后修改基础列表。 迭代器不喜欢这样

正如javadoc所说:


这个类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建后的任何时候,列表在结构上被修改,除了通过迭代器自己的remove或add方法,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不是在将来的不确定时间冒着任意、不确定行为的风险。

在初始化类实例时创建迭代器,然后修改基础列表。 迭代器不喜欢这样

正如javadoc所说:


这个类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建后的任何时候,列表在结构上被修改,除了通过迭代器自己的remove或add方法,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不是在将来的不确定时间冒任意、不确定行为的风险。

这里的问题是,您在开始时创建了一个迭代器,然后修改了列表


解决方案:在搜索方法中获取迭代器并使用它。

这里的问题是,您在开始时创建了一个迭代器,然后修改了列表


解决方案:在搜索方法中获取迭代器并使用它。

作为旁注:if input==iterator.next{System.out.printlniterator.next;}将使迭代器2前进times@berney_mark是的,否则您将遇到NosTouchElementException,或者跳过元素,在这里找不到您在开始创建迭代器时遇到的任何问题,然后修改了列表。不要那样做。在搜索方法中,获取迭代器并使用它。@berney_mark不要将已解决的问题放在问题标题中,这不是论坛,而是通过单击分数旁边的复选图标来接受对您帮助最大的答案。也可以读一下@berney_mark把它作为一个答案。如果它有助于您接受它,那么只需附带说明:If input==iterator.next{System.out.printlniterator.next;}将使迭代器2前进times@berney_mark是的,否则您将遇到NoSuchElementException,或者只是跳过元素,在这里找不到任何问题,您在开始时创建了迭代器,然后修改了列表。不要那样做。在搜索方法中,获取迭代器并使用它。@berney_mark不要将已解决的问题放在问题标题中,这不是论坛,而是通过单击分数旁边的复选图标来接受对您帮助最大的答案。也可以读一下@berney_mark把它作为一个答案。如果它对你有帮助,那就接受它
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)
    at SearchList.search(SearchList.java:23)
    at SearchList.main(SearchList.java:38)```