【发布时间】:2020-05-17 22:52:43
【问题描述】:
我在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)
为什么会这样?请注意,我已经删除了迭代器前后的代码,以保持这篇文章的简短。
【问题讨论】:
-
只是因为你的应用程序。有图形用户界面,并不意味着添加swing 标签是合适的。保留与问题相关的标签。
-
你是否试图从迭代器中删除 (
iterator.remove();) ?还是来自收藏?如需更多帮助,请发布minimal reproducible example 并标记引发异常的行。 -
由于
.remove()在嵌套循环中被调用,您可以多次调用它吗?如果是这样,这将导致异常被抛出。您应该在调用 remove 后立即跳出循环。是的,@c0der 是对的——您需要创建并发布一个minimal reproducible example 以充分允许在不猜测的情况下回答问题。
标签: java iterator illegalstateexception