Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:无法更改迭代器列表_Java_Collections_Iterator - Fatal编程技术网

Java:无法更改迭代器列表

Java:无法更改迭代器列表,java,collections,iterator,Java,Collections,Iterator,我有一个ListIterator列表作为类字段。我用方法grow()填充它。当我尝试使用这个列表中的迭代器时,我得到了ConcurrentModificationException ListIterator<ListIterator<PointF>> i = mPoints.listIterator(); while (i.hasNext()) { ListIterator<PointF> j = i.next(); if (j.hasNext

我有一个
ListIterator
列表作为类字段。我用方法
grow()
填充它。当我尝试使用这个列表中的迭代器时,我得到了
ConcurrentModificationException

ListIterator<ListIterator<PointF>> i = mPoints.listIterator();
while (i.hasNext()) {
    ListIterator<PointF> j = i.next();
    if (j.hasNext())
        PointF tmp = j.next(); // Exception here
}
ListIterator i=mPoints.ListIterator();
while(i.hasNext()){
ListIterator j=i.next();
if(j.hasNext())
PointF tmp=j.next();//此处出现异常
}

除了
grow()

如果基础列表发生更改,那么在此之前获得的迭代器将抛出
ConcurrentModificationException
,我不知道为什么此代码会导致任何方法中的异常。因此,不要将迭代器存储在实例字段中。

如果基础列表发生更改,则在此之前获得的迭代器将抛出
ConcurrentModificationException
。因此,不要将迭代器存储在实例字段中。

我们可以肯定的是,
ConcurrentModificationException
意味着在调用迭代器后的某个点上修改了基础iterable

这并不总是意味着多线程中的并发;通过在循环期间遍历列表并删除元素,可以很容易地触发此异常。因此,如果没有其他线程可能修改它,那么我们可以说当前线程在某个点修改了迭代器的底层数据结构

这里没有足够的代码可以确定,但是您存储迭代器的做法有点可疑。什么时候将(内部)迭代器添加到
mPoints
?如果它们引用的集合在迭代器创建后的任何时间发生更改,则在调用时将引发此异常。因此,只要将迭代器添加到
mPoints
集合中,迭代器的数据结构就会被有效地锁定以进行更改,但这在代码中并不十分清楚

所以我怀疑这是你问题的根本原因。除非是在很短的时间内(通常是在单个词法范围内,例如,单个方法调用),否则存储迭代器可能不是一个好主意,因为您看到的原因。最好存储对底层集合本身的引用,然后在上面的代码块中创建迭代器,例如:

ListIterator<Iterable<PointF>> i = mPoints.listIterator();
while (i.hasNext()) {
    Iterator<PointF> j = i.next().iterator();
    if (j.hasNext())
        PointF tmp = j.next();
}
ListIterator i=mPoints.ListIterator();
while(i.hasNext()){
迭代器j=i.next().Iterator();
if(j.hasNext())
PointF tmp=j.next();
}

然后,确切的解决方案取决于方法的总体架构。要记住的主要一点是不要长期存储迭代器,因为要使其可靠工作几乎是不可能的。即使它现在真的起作用了,它在代码的不同部分之间创建了一种看不见的依赖关系,几乎总是会被实现本应是微不足道的更改的人打破。

我们可以肯定的是,
ConcurrentModificationException
意味着在调用获取迭代器

这并不总是意味着多线程中的并发;通过在循环期间遍历列表并删除元素,可以很容易地触发此异常。因此,如果没有其他线程可能修改它,那么我们可以说当前线程在某个点修改了迭代器的底层数据结构

这里没有足够的代码可以确定,但是您存储迭代器的做法有点可疑。什么时候将(内部)迭代器添加到
mPoints
?如果它们引用的集合在迭代器创建后的任何时间发生更改,则在调用时将引发此异常。因此,只要将迭代器添加到
mPoints
集合中,迭代器的数据结构就会被有效地锁定以进行更改,但这在代码中并不十分清楚

所以我怀疑这是你问题的根本原因。除非是在很短的时间内(通常是在单个词法范围内,例如,单个方法调用),否则存储迭代器可能不是一个好主意,因为您看到的原因。最好存储对底层集合本身的引用,然后在上面的代码块中创建迭代器,例如:

ListIterator<Iterable<PointF>> i = mPoints.listIterator();
while (i.hasNext()) {
    Iterator<PointF> j = i.next().iterator();
    if (j.hasNext())
        PointF tmp = j.next();
}
ListIterator i=mPoints.ListIterator();
while(i.hasNext()){
迭代器j=i.next().Iterator();
if(j.hasNext())
PointF tmp=j.next();
}

然后,确切的解决方案取决于方法的总体架构。要记住的主要一点是不要长期存储迭代器,因为要使其可靠工作几乎是不可能的。即使它现在确实可以工作,它也会在代码的不同部分之间创建一种无形的依赖关系,几乎总是会被实现本应是微不足道的更改的人打破。

请发布一个简短但完整的程序来演示问题。@Jon Skeet问题解决了,在获得迭代器后,我修改了我的列表
mPoints
。请发布一个简短但完整的程序来演示问题。@Jon Skeet问题解决了,我在获得迭代器后修改了列表
mPoints