Mar*_*sen 0 java loops concurrentmodification
我有一个正常的数据库调用,从我的数据库收集信息.我使用这些信息来创建我的对象(CallQueue)然后将这些对象添加到列表中,然后返回列表.
突然间我发现我原来的代码没有按预期工作,因为我创建了dublicates,所以现在我试图取消任何dublicates被创建!但有个问题!
我无法遍历我的列表并检查是否已创建对象!
这是我的代码:
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;
Run Code Online (Sandbox Code Playgroud)
我从中获得的执行是:
Caused by: java.util.ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud)
香港专业教育学院试图在ConcurrentModificationException 上查找execption
任何人都可以帮我解决这个问题吗?
你在迭代中做了一个补充.根据规范,您不能修改您正在迭代的集合.
经典的解决方案是首先制作一个集合的副本,然后迭代它.另一个解决方案是不使用迭代器(短的foreach表示法隐式使用它),而是使用索引手动迭代.
for (int i=0; i<queues.size(); i++) {
CallQueue callQueue = queues.get(i);
... code goes here
}
Run Code Online (Sandbox Code Playgroud)
更好的解决方案是使用Set而不是列表(除非订单对您很重要).这意味着您必须正确实现equals和hashcode.
顺便说一句:我相信你的代码存在缺陷.您正在遍历列表,如果您遇到的项目不匹配,则在末尾添加一个.这意味着,如果您要查找的项目是列表中的第x项,则您将添加一个新项目x次.我严重怀疑这是你需要的.如果你做一些重构,这将立即变得清晰.