迭代器中的空指针

时间:2013-12-04 19:05:12

标签: java null iterator

public void putExpensiveWineCaseBack(double notBiggerThan)
{
   Iterator<WineCase> it = basket.iterator();
   WineCase checkedWineCase = null;
   while( it.hasNext() )
   {
       checkedWineCase = it.next();
       double checkedPrice = checkedWineCase.getPrice();
       int i=0;
       for(i=0; i<basket.size(); i++)
        {
        if(checkedPrice > notBiggerThan)
        {
            basket.remove(i);
        }
      }
    }
} 

}

此代码正在编译中。问题是,执行时我收到此错误:

java.util.ConcurentModificationexception:
null(in java.util.ArrayList$Itr) 

这一行:

checkedWineCase = it.next();

我错过了什么?

6 个答案:

答案 0 :(得分:1)

改变
  basket.remove(i);

   it.remove();

答案 1 :(得分:0)

问题是你在迭代时从篮子中删除元素。

实际上我不确定你要做什么,因为for循环对我来说没什么意义。但我想如果价格大于notBiggerThan,你想要从Set中删除元素。

所以也许你应该尝试这样:

while(it.hasNext()) {
   checkedWineCase = it.next();
   double checkedPrice = checkedWineCase.getPrice();
   if(checkedPrice > notBiggerThan)
   {
     it.remove();
   }
}

答案 2 :(得分:0)

除了Iterator.remove()之外,您不应在迭代时修改集合。

问题来自您致电basket.remove(i);

我不完全理解你想要用内循环来做什么(目前看起来它会从你的篮子中移除所有价格&gt;而不是最大值),也许你想要以下内容: / p>

public void putExpensiveWineCaseBack(double notBiggerThan)
{
   Iterator<WineCase> it = basket.iterator();
   WineCase checkedWineCase = null;
   while( it.hasNext() )
   {
       checkedWineCase = it.next();
       double checkedPrice = checkedWineCase.getPrice();

       if(checkedPrice > notBiggerThan)
       {
           it.remove();
       }

    }
} 

答案 3 :(得分:0)

您正在致电basket.remove(),但应致电it.remove()

答案 4 :(得分:0)

您正在循环中从列表中删除项目,您将遍历列表中的项目。这是ConcurrentModificationException的原因。

答案 5 :(得分:0)

'空指针'并不能准确描述您的问题,而是您收到的异常的名称:ConcurentModificationexception

当实例化迭代器时,它提供对某组对象的访问,在这种情况下,是“basket”的内容。从获取迭代器中的第一个对象到获取最后一个对象可能需要一些时间。

现在,如果“篮子”中的对象发生变化会发生什么?迭代器设计为“快速失败”,这意味着如果篮子已经更改,下次尝试使用迭代器时,会立即 获得异常。

这种情况正在发生,因为在某些情况下,在完成对篮子中所有内容的迭代之前,你会调用'basket.remove()' 。您可能希望“记住”应该从篮子中删除哪些内容,然后仅在完成迭代器完成后才删除它们。

谷歌“java iterator concurrentmodificationexception”,可以看到您遇到的问题的更多解释。