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