簡體   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