gpt4 book ai didi

java - 并发修改异常

转载 作者:行者123 更新时间:2023-12-01 17:27:49 25 4
gpt4 key购买 nike

我有一个正常的数据库调用,它从我的数据库收集信息。我使用这些信息来创建我的对象 (CallQueue),然后将这些对象添加到列表中,然后返回列表。

突然我发现我原来的代码没有按预期工作,因为我创建了重复项,所以现在我试图取消正在创建的任何重复项!但是有一个问题!

我无法循环遍历列表并检查对象是否已创建!

这是我的代码:

while (query.next()) {
if (!queues.isEmpty()) {
/*This gives the Execption->*/
for (CallQueue callQueue : queues) {
if (callQueue.getType().equals(query.getString("KØ"))) {
double decimalTime = query.getDouble("TID");
int hourOfDay = (int)Math.round(24 * decimalTime);
int callAmount = query.getInteger("ANTAL_KALD");
if (hourOfDay > 19) {
hourOfDay = 19;
}
callQueue.addCallsByTime(hourOfDay, callAmount);
} else {
String queueName = query.getString("Kø");
if (!queueName.equalsIgnoreCase("PrivatOverflow")) {
CallQueue cq = new CallQueue(query.getString("KØ"));
double decimalTime = query.getDouble("TID");
int hourOfDay = (int)Math.round(24 * decimalTime);
int callAmount = query.getInteger("ANTAL_KALD");
if (hourOfDay > 19) {
hourOfDay = 19;
}
cq.addCallsByTime(hourOfDay, callAmount);
queues.add(cq);
}
}
}
} else {
String queueName = query.getString("Kø");
if (!queueName.equalsIgnoreCase("PrivatOverflow")) {
CallQueue cq = new CallQueue(query.getString("KØ"));
double decimalTime = query.getDouble("TID");
int hourOfDay = (int)Math.round(24 * decimalTime);
int callAmount = query.getInteger("ANTAL_KALD");
if (hourOfDay > 19) {
hourOfDay = 19;
}
cq.addCallsByTime(hourOfDay, callAmount);
queues.add(cq);
}
}
}

for (CallQueue callQueue : queues) {
System.out.println(callQueue.getType());
}
query.Close();
return queues;

我从中得到的执行是:

Caused by: java.util.ConcurrentModificationException

我尝试在ConcurrentModificationException查找执行

谁能帮我解决这个问题吗?

最佳答案

您正在迭代中进行添加。根据规范,您不得修改正在迭代的集合。

经典的解决方案是首先创建集合的副本,然后对其进行迭代。另一种解决方案是不使用迭代器(短 foreach 表示法隐式使用它),而是使用索引手动迭代。

for (int i=0; i<queues.size(); i++) {
CallQueue callQueue = queues.get(i);

... code goes here

}

更好的解决方案是使用集合而不是列表(除非顺序对您很重要)。这确实意味着您必须正确实现 equals 和 hashcode。

顺便说一句:我相信您的代码有缺陷。您正在迭代列表,如果遇到的项目不匹配,则在末尾添加一个。这意味着,如果您要查找的项目是列表中的第 x 个项目,则您将添加新项目 x 次。我严重怀疑这就是你所需要的。如果您进行一些重构,这一点就会立即变得清晰。

关于java - 并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com