0

我有一个正常的数据库调用,它从我的数据库中收集信息。我使用这些信息来创建我的对象(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 查找执行

谁能帮我解决这个问题?

4

2 回答 2

5

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

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

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

    ... code goes here

}

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

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

于 2012-11-28T16:10:16.190 回答
0

使用 set 而不是 List 来避免这个问题。您可以在要修改的同一列表上进行迭代。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ConcurrentModificationException.html

于 2012-11-28T16:13:30.947 回答