使用list.remove()时出现Java ConcurrentModificationException [英] Java ConcurrentModificationException when using list.remove()

查看:141
本文介绍了使用list.remove()时出现Java ConcurrentModificationException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为 removeSup 的方法,它应该从补充列表中删除一个对象 Supplement
这是方法的代码:

I've got a method called removeSup which is supposed to remove an object Supplement from a list of supplements. this is the code for the method:

private static void removeSup(Supplement supToRemove, List<Supplement> listToRemoveFrom) {
   Iterator<Supplement> iterator = listToRemoveFrom.iterator();
                while(iterator.hasNext()){
                    if(iterator.next().equals(supToRemove)){
                        iterator.remove();
                    }
                }
}

有一个叫做 magazine ,它定义了补充列表。

there is a class called magazine which defines the list of supplements.

public class Magazine {
  private List<Supplement> supList;
  public List<Supplement> getSupList() {
        return this.supList;
    }
  public void setSupList(List<Supplement> supList) {


      this.supList = supList;
        }
public Magazine(Double cost, String _name){
        this.supList = new ArrayList<>();
        this.weekCost = cost;
        this.name = _name;
    }
    }

班级补充具有以下构造函数

public Supplement(String _name, Double _price, String _magName ){
        this.name=_name;
        this.price=_price;
        this.magName = _magName;
    }

c>搜索用户可以删除某个补充

in the main class client there is a search that the user can do to remove a certain Supplement

private static void searchSup(){
   System.out.println("Search for Supplement");
        String search = scanner.nextLine();
        for (Supplement sup : magazine.getSupList()) {
            if (!sup.getSupName().equalsIgnoreCase(search)) {
         //do something
        }
        else{
              removeSup(sup,magazine.getSupList());
        }
    }

}
客户端的主要方法课程如下:

} the main method in the client class is as follows:

 private Magazine magazine;
        public static void main(String[] args) {
                magazine = new Magazine(3.0, "pop");
                List<Supplement> startList = new ArrayList<>();
            startList.add(new Supplement("Nat Geo", 3.0,"pop"));
            startList.add(new Supplement("Discovery", 5.0,"pop"));
            startList.add(new Supplement("Health", 6.3,"pop"));
            startList.add(new Supplement("IT", 8.3,"pop"));
            magazine.setSupList(startList);
            searchSup();
        }

当我运行此程序并输入任何添加的补充剂时,我得到一个错误

When I run this program and type any of the added supplements, i get an error

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at Client.searchSup(Client.java:131)
    at Client.searchSup(Client.java:140)
    at Client.main(Client.java:588)

是我用来搜索的for循环给我一个错误?如果是这样我将如何解决此问题?

is it the for loop i am using to search giving me an error? if so how would i go about fixing this?

推荐答案

我发现我正在进行的搜索不适用于我我想这样做我创建了一个方法,它返回列表中Supplement的整数。

I figured out that the search i was doing was not working with what i wanted to do so i created a method which returns an integer of the Supplement in the list.

private static int indexOfSup(List<Supplement> supSearchList, String nameOfSup) {
        for (Supplement sup : supSearchList) {
            if (sup.getSupName().equalsIgnoreCase(nameOfSup)) {
                return supSearchList.indexOf(sup);
            }
        }
        return -1;
    }

然后使用此整数从列表中删除。
a简单 List.Remove(index)工作正常

i then use this integer to remove from the list. a simple List.Remove(index) worked fine

感谢所有回复。

这篇关于使用list.remove()时出现Java ConcurrentModificationException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆