使用list.remove()时出现Java ConcurrentModificationException

时间:2014-04-03 01:01:53

标签: java arraylist iterator

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

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的类,用于定义补充列表。

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;
    }
    }

supplement具有以下构造函数

public Supplement(String _name, Double _price, String _magName ){
        this.name=_name;
        this.price=_price;
        this.magName = _magName;
    }
主要类client中的

用户可以执行搜索以删除某个补充

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());
        }
    }

} 客户端类中的main方法如下:

 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();
        }

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

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循环给我一个错误吗?如果是这样我将如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

通常不应在迭代时修改Collection。修改元素很好,但在迭代时你真的不应该从Collection删除一些东西。见这里:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html。此外,ConcurrentModificationException的Javadoc可能会有所帮助。

您可以尝试返回删除了Supplement的新列表:

 private static List<Supplement> removeSup(Supplement supToRemove, List<Supplement> listToRemoveFrom) {
    List<Supplement> filteredSupplements = new ArrayList<Supplement>();
    for(Supplement supplement : listToRemoveFrom) {
       if(!suppplement.equals(supToRemove)){
           filteredSupplements.add(supplement);
       }

    }

    return filteredSupplements;
}

答案 1 :(得分:0)

它接缝“杂志”是main的方法中的局部变量,不能被searchSup访问。它喜欢它     private void searchSup(杂志杂志)     {         // ...     } 如果你能提供更多细节,第131和140行的代码将会有所帮助。

答案 2 :(得分:0)

我发现我正在进行的搜索不符合我想要的操作,因此我创建了一个方法,该方法在列表中返回Supplement的整数。

private static int indexOfSup(List<Supplement> supSearchList, String nameOfSup) {
        for (Supplement sup : supSearchList) {
            if (sup.getSupName().equalsIgnoreCase(nameOfSup)) {
                return supSearchList.indexOf(sup);
            }
        }
        return -1;
    }
然后我使用这个整数从列表中删除。 一个简单的List.Remove(index)工作正常

感谢所有回复。