代码之家  ›  专栏  ›  技术社区  ›  SeanConnery

如何修复java.util.ConcurrentModificationException?

  •  0
  • SeanConnery  · 技术社区  · 11 年前

    我的代码的目的是让用户输入一个汽车名称,然后在数组列表中搜索并找到与用户输入的内容匹配的对象。每当我运行代码时,都会收到java.util.ConcurrentModificationException错误。非常感谢对该错误含义的解释以及修复该错误的建议:)

    public static void arrayList()
    {
        //Declarations
        ArrayList<String> list = new ArrayList<String> ();             
        ListIterator<String> iterator = list.listIterator();
        list.add ("Aston Martin");
        list.add ("Ferrari"); 
    
        Scanner scan = new Scanner(System.in); 
        String car = new String();
        String search = new String();
    
    
        //Prompts user to enter car name
        System.out.println ("Enter car name: ");    
        car = scan.nextLine();  
    
        //Searches array list for car
        while (iterator.hasNext())
        {
            search = iterator.next();           
            if (search.equalsIgnoreCase (car))
            {
                System.out.println (search);
            }
        }                   
    }
    
    3 回复  |  直到 11 年前
        1
  •  3
  •   chrylis -cautiouslyoptimistic-    11 年前

    相关集合的Javadocs和 ConcurrentModificationException 清楚:

    当不允许对对象进行并发修改时,检测到对象的并发修改的方法可能会引发此异常。

    你开始了一次迭代 list 但随后修改它并返回迭代器。

    在即将使用迭代器之前不要打开迭代器 remove() ,只需使用增强型 for 循环:

    for(String item: list) {
        if(item.equalsIgnoreCase (car)) {
            System.out.println(item);
        }
    }
    
        2
  •  1
  •   Prabhat user3469203    11 年前

    打开一个迭代器,然后更改列表的结构,使用for each循环而不是迭代器。如果仍要使用ListIterator,请在将元素添加到列表后打开迭代器(如下所示)。。

        ArrayList<String> list = new ArrayList<String>();
        list.add("Aston Martin");
        list.add("Ferrari");
        ListIterator<String> iterator = list.listIterator();
    
        3
  •  0
  •   vard thanhnguyen    10 年前

    我遇到了同样的问题,但在涉及的问题上有点不同 ConcurrentModificationException .我的,实际上是 sort 对集合的方法调用 初始化时。我对数据进行了迭代,在另一个线程中进行了排序方法处理。不知怎么的 Collection.sort(...) 进程也会触发此异常。

    迭代的初始代码为:

     ...
    //_Methode_a
        for (final Entry<String, List<GmScope>> scopes : model.getProjectData().entrySet()) {
                        for (final GmScope scope : scopes.getValue()) { //Where exception occures
        ...
    
    //Method_b using a different Thread
    ...
        Collections.sort(scopeList, new Comparator<GmScope>() {
                    @Override
                    public int compare(final GmScope o1, final GmScope o2) {
                        return o1.getScopeName().compareTo(o2.getScopeName());
                    }
    
                });
    ...
    

    为了解决我的问题 使生效 Comparable 我的bean接口 并在此定义比较过程。然后 我已删除 集合.排序(…) 在我的方法中定义 .

    public class GmScope implements Comparable<GmScope> {
    ...
    @Override
            public int compareTo(final GmScope o1) {
                return this.getScopeName().compareTo(o1.getScopeName());
            }
    }