繁体   English   中英

Iterator.remove() IllegalStateException

[英]Iterator.remove() IllegalStateException

在下面的代码中,我有一个 try catch 块,它尝试使用迭代器从 Vector 中删除一个元素。 我创建了自己的类QueueExtendingVect来扩展Vector并实现Iterator

变量qev1QueueExtendingVect类的一个实例。 我也已经向这个 Vector 添加了一些元素。

try 
{
   qev1.iterator().remove();
}
catch(UnsupportedOperationException e) 
{
   System.out.println("Calling Iterator.remove() and throwing exception.");
}

qev1.enqueue(ci); 
qev2.enqueue(ci);
qcv1.enqueue(ci);
qcv2.enqueue(ci);

for (int i = 1; i < 5; i++)
{
   if (i % 2 == 0)
   {
       qev1.enqueue(new CInteger(i+1));
       qev2.enqueue(new CInteger(i+1));
       qcv1.enqueue(new CInteger(i+1));
       qcv2.enqueue(new CInteger(i+1));
   } 
   else 
  { 
       qev1.enqueue(new Date(i*i));
       qev2.enqueue(new Date(i*i));
       qcv1.enqueue(new Date(i*i));
       qcv2.enqueue(new Date(i*i));
   }
}

在这段代码中,我向 Vector qev1 添加了一些元素。 其他变量位于代码的其他部分。

但是,当我运行我的程序时,我在运行时收到了 IllegalStateException。 我不确定这意味着什么。

您尚未在Iterator上调用next() ,因此它尚未指代第一项。 您无法删除尚未指定的项目。

先调用next()以前进到第一项,然后调用remove()

@rgettman 答案是正确的,但要给您想象力。

我们的收藏:|el1| |el2| |el3|

当您调用iterator.next()它的工作方式如下:

|el1| 迭代器 |el2| |el3|

所以它跳过元素并返回对被跳转元素的引用(|el1|)。 所以如果我们现在调用iterator.remove() ,|el1| 将被删除。

这是值得添加什么@PedroBarros上面提到的-你不能叫iterator.remove()两次没有iterator.next()他们之间因为IllegalStateException会被抛出。 同样,当您创建两个迭代器(iterator1、iterator2)然后调用:

iterator1.next();
iterator1.remove();
iterator2.next();

将抛出 ConcurrentModificationException 因为iterator2检查集合已被修改。

它也会调用这个 exeption,如果你在迭代器中向列表中添加了一些东西,然后在它之后不再调用it.next()而是删除该项目

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM