![](/img/trans.png)
[英]java.lang.IllegalStateException in iterator.remove()
[英]Java: `iterator.remove` throws IllegalStateException
我在一個thread
有一個iterator
,我正在嘗試刪除重復的記錄。
Runnable readingThread = new Runnable() {
@Override
public void run() {
Iterator<Demand> iterator = null;
for (iterator = demandListFromFile.iterator(); iterator.hasNext();) {
Demand demand = iterator.next();
/**
* Find and assign the Item ID
*/
if (itemListHashMap.containsValue(demand.getItem().getItemName())) {
demand.getItem().setIditem(itemListHashMapReversed.get(demand.getItem().getItemName()));
} else {
unavailableItemsList.add(demand.getItem().getItemName());
}
/**
* Find and remove duplicate records
*/
for (Map.Entry<Date, String> entry : demandListHashMap.entries()) {
if (demand.getDueDate().equals(entry.getKey()) && demand.getItem().getItemName().equals(entry.getValue())) {
iterator.remove();
}
}
}
}
刪除幾個項目后, iterator.remove
拋出以下異常
Exception in thread "Thread-0" java.lang.IllegalStateException
at java.base/java.util.ArrayList$Itr.remove(ArrayList.java:1009)
at com.xxx.xxx.ui.Home$7.run(Home.java:455)
at java.base/java.lang.Thread.run(Thread.java:834)
為什么會這樣? 請注意,我已經刪除了迭代器前后的代碼,以保持這篇文章的簡短。
Iterator.java 移除方法:
@throws IllegalStateException if the next method has not
yet been called, or the remove method has already
been called after the last call to the next method
void remove() {
..
}
問題出在您的 for 循環“查找並刪除重復記錄”中,您可能不止一次調用 iterator.remove。 remove 方法刪除您正在查看的當前元素,因此您每次只能使用 next() 調用它一次。 為了確保它只被調用一次,在iterator.remove();
下面添加一個break
語句iterator.remove();
@CausingUnderflowsEverywhere陳述的原因是完全正確的。
除此之外,在看到實現后, iterator.remove
元素在內部調用ArrayList.remove
方法。
ArrayList 維護在名為lastRet
的變量中返回的最后一個元素的索引。刪除元素后,ArrayList.remove 方法將lastRet
設置為 -1。
ArrayList.remove 的第一個檢查是
if (lastRet < 0)
{
throw new IllegalStateException();
}
這就是后台發生的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.