如何修复 java.util.ConcurrentModificationException?

How do I fix java.util.ConcurrentModificationException?

我的代码的目的是让用户输入汽车名称,然后搜索数组列表并找到与用户输入的内容相匹配的对象。每当我 运行 代码时,我都会收到 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);
        }
    }                   
}

相关集合的 Javadocs 和 ConcurrentModificationException 很清楚:

This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.

您在 list 上开始了迭代,但随后对其进行了修改并返回到迭代器。

在您即将使用迭代器之前不要打开它。更好的是,因为您不需要访问 remove(),只需使用增强的 for 循环:

for(String item: list) {
    if(item.equalsIgnoreCase (car)) {
        System.out.println(item);
    }
}

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

    ArrayList<String> list = new ArrayList<String>();
    list.add("Aston Martin");
    list.add("Ferrari");
    ListIterator<String> iterator = list.listIterator();

我遇到了同样的问题,但在 ConcurrentModificationException 中涉及的内容有点不同。我的实际上是 a 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());
                }

            });
...

为了解决这个问题,我实现了我的 beanComparable 接口 并在那里定义了比较过程。然后我删除了我的方法中定义的Collection.sort(...)

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