迭代器删除操作不起作用

时间:2015-01-13 09:14:24

标签: iterator

我收到此错误:

Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at onlineShopExamen.Client.remove(Client.java:30) at onlineShopExamen.Main.<init>(Main.java:17) at onlineShopExamen.Main.main(Main.java:23)

我的代码是:

public void remove(){
    Iterator<Product> iter = lijstProducten.iterator();
    while(iter.hasNext()){
        Product movie = iter.next();
        lijstProducten.remove(movie);
    }
}

产品是产品列表(本例中为电影)

使用此:

public void remove(){
    Iterator<Product> iter = lijstProducten.iterator();
    while(iter.hasNext()){
        iter.remove();
    }
}

不能正常工作

这给了我这个错误:

Exception in thread "main" java.lang.IllegalStateException
at java.util.ArrayList$Itr.remove(Unknown Source)
at onlineShopExamen.Client.remove(Client.java:30)
at onlineShopExamen.Main.<init>(Main.java:19)
at onlineShopExamen.Main.main(Main.java:25)

编辑已修复

这有效:

public void remove(){
    Iterator<Product> iter = lijstProducten.iterator();
    while(iter.hasNext()){
        iter.next();
        iter.remove();
    }
}

3 个答案:

答案 0 :(得分:3)

这是什么称为保守迭代器:一旦底层容器被修改,任何指向该容器的迭代器都会失效(ConcurrentModificationException意味着什么)。

Iterator.remove方法。用它。

public void remove(){
    Iterator<Product> iter = lijstProducten.iterator();
    while(iter.hasNext()){
        iter.next();
        iter.remove(); // removes previous item
    }
}

你可能(假设lijstProducten是List)也像Ankit所提到的那样写

public void remove(){
    lijstProducten.clear();
}

答案 1 :(得分:1)

除了Beyeler的回答。正如我从您的代码中看到的那样,您的remove方法正在清除整个列表。

我建议您使用方法myList.clear();从列表中删除所有元素,而不是使用自己的方法。

答案 2 :(得分:0)

尝试iter.remove()而不是lijstProducten.remove(电影)。你不能修改你迭代的列表,但是会在Iterator中删除为你做这个的方法。