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