43 java concurrentmodification
我有这段小代码,它给了我并发修改异常.我无法理解为什么我一直得到它,即使我没有看到任何同时进行的修改.
import java.util.*;
public class SomeClass {
public static void main(String[] args) {
List<String> s = new ArrayList<>();
ListIterator<String> it = s.listIterator();
for (String a : args)
s.add(a);
if (it.hasNext())
String item = it.next();
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
Pas*_*ent 52
为避免这种情况ConcurrentModificationException,您应该像这样编写代码:
import java.util.*;
public class SomeClass {
public static void main(String[] args) {
List<String> s = new ArrayList<String>();
for(String a : args)
s.add(a);
ListIterator<String> it = s.listIterator();
if(it.hasNext()) {
String item = it.next();
}
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
A java.util.ListIterator允许您在迭代期间修改列表,但不允许在创建和使用它之间修改列表.
Ste*_*n C 44
我无法理解为什么我一直得到它,即使我没有看到任何同时进行的修改.
在创建迭代器和开始使用迭代器之间,您向要迭代的列表添加了参数.这是一个并发修改.
ListIterator<String> it = s.listIterator();
for (String a : args)
s.add(a); // concurrent modification here
if (it.hasNext())
String item = it.next(); // exception thrown here
Run Code Online (Sandbox Code Playgroud)
在完成向列表中添加元素之后创建迭代器:
for (String a : args)
s.add(a);
ListIterator<String> it = s.listIterator();
if (it.hasNext())
String item = it.next();
Run Code Online (Sandbox Code Playgroud)
修改基础列表后,不允许继续迭代迭代器.在这里你先添加几个项目之前创建迭代器,然后在添加s之后继续执行a hasNext()和a next(),导致ConcurrentModificationException
如果上述解决方案无法正常工作.您可以使用旧的for循环来迭代List,同时添加新项.请参阅以下示例:
import java.util.*;
public class SomeClass {
public static void main(String[] args) {
ArrayList<AClass> aList = new ArrayList<AClass>(); // we will iterate this
// this will cause ConcurrentModificationException.
// Since we are iterating the list, at the same time modifying it.
/*for(AClass a: aList){
aList.add(someMethod(a));
}*/
// old fashion for-loop will help
int limit = aList.size();
for(int i=0; ctr<limit; ++i){
AClass a = aList.get(i);
aList.add(someMethod(a));
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66650 次 |
| 最近记录: |