我如何修复java.util.ConcurrentModificationException?

时间:2015-03-13 05:07:39

标签: java concurrentmodification

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

答案 0 :(得分:2)

相关馆藏的Javadoc和ConcurrentModificationException很清楚:

  

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

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

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

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

答案 1 :(得分:0)

你打开一个迭代器,然后更改列表的结构,使用for for循环而不是迭代器,如果你仍然想使用ListIterator,那么在将元素添加到列表之后打开迭代器就像这样..

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

答案 2 :(得分:0)

我遇到了同样的问题,但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());
                }

            });
...

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

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