Java:`iterator.remove` 抛出 IllegalStateException
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.run(Home.java:455)
at java.base/java.lang.Thread.run(Thread.java:834)
为什么会这样?请注意我已经删除了迭代器前后的代码,以保持 post 简短。
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
语句
@CausingUnderflowsEverywhere说的理由完全正确。
除此之外,在看到实现后,iterator.remove
元素在内部调用了 ArrayList.remove
方法。
ArrayList 正在维护名为 lastRet
的变量中返回的最后一个元素的索引
删除元素后,ArrayList.remove 方法将 lastRet
设置为 -1。
ArrayList.remove 的第一个检查是
if (lastRet < 0)
{
throw new 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.run(Home.java:455)
at java.base/java.lang.Thread.run(Thread.java:834)
为什么会这样?请注意我已经删除了迭代器前后的代码,以保持 post 简短。
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
语句
@CausingUnderflowsEverywhere说的理由完全正确。
除此之外,在看到实现后,iterator.remove
元素在内部调用了 ArrayList.remove
方法。
ArrayList 正在维护名为 lastRet
的变量中返回的最后一个元素的索引
删除元素后,ArrayList.remove 方法将 lastRet
设置为 -1。
ArrayList.remove 的第一个检查是
if (lastRet < 0)
{
throw new IllegalStateException();
}
这是后台发生的事情。