我正在尝试使用Iterator,但它给了我这个错误:
java.util.concurrentModificationException:null(in 的java.util.ArrayList $ ITR)
代码在这里:
import java.util.ArrayList;
import java.util.Iterator;
public class Iteratorr
{
ArrayList<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
void add()
{
list.add("Hello");
list.add("I");
list.add("am");
list.add("ArrayList");
}
void print()
{
while(it.hasNext())
{
String str = it.next();
System.out.println(str);
}
}
}
有谁可以解释原因?
答案 0 :(得分:3)
事件顺序如下:
这不会起作用,因为第2步使迭代器无效。这就是异常告诉你的。来自Javadoc:
[
ArrayList
&#39; s]iterator
和listIterator
方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时候对列表进行结构修改,除了通过迭代器自己的remove
或add
方法之外,迭代器将抛出ConcurrentModificationException
。
您需要在开始迭代之前创建迭代器:
public class Iteratorr
{
...
Iterator<String> it = null;
void print() {
it = list.iterator();
while(it.hasNext()) {
String str = it.next();
System.out.println(str);
}
}
(更好的方法是在it
内声明print
而不是作为班级成员。)
现在写这种循环的惯用方法是
void print() {
for (String str : list) {
System.out.println(str);
}
}
它与使用显式迭代器具有相同的效果,但在眼睛上更容易。
答案 1 :(得分:2)
在对列表进行最后一次更改后,您必须检索迭代器! 否则它将是一个不同的迭代器,它不会“知道”新List的内容。
隐含地利用(默认)迭代器的更优雅方式:
void print()
{
for(String str : list)
{
System.out.println(str);
}
}
虽然这可能更适合理解,特别是如果您想稍后定义自己的迭代器:
void print()
{
Iterator<String> it = list.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
答案 2 :(得分:0)
该Excpption取决于您如何调用该方法。您可以在方法中本地使用变量,如下所示。
void print()
{
ArrayList<String> list = new ArrayList<>();
//Add elements here
add(list);
Iterator<String> it = list.iterator();
while(it.hasNext()) {
String str = it.next();
System.out.println(str);
}
}
void add( List list)
{
list.add("Hello");
list.add("I");
list.add("am");
list.add("ArrayList");
}