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

iveはConcurrentModificationException で実行を検索しようとしました

誰かが私がこの問題を解決するのを手伝ってもらえますか?

4

2 に答える 2

5

イテレーション内で追加を行っています。仕様により、繰り返し処理するコレクションを変更することは許可されていません。

古典的な解決策は、最初にコレクションのコピーを作成し、代わりにそれを繰り返すことです。別の解決策は、イテレータを使用せず(短いforeach表記は暗黙的に使用します)、インデックスを使用して手動で反復することです。

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

    ... code goes here

}

より良い解決策は、リストの代わりにセットを使用することです(順序が重要でない限り)。つまり、equalsとハッシュコードを適切に実装する必要があります。

ところで:あなたのコードには欠陥があると思います。リストを繰り返し処理していて、遭遇したアイテムが一致しない場合は、最後に1つ追加します。つまり、探しているアイテムがリストのx番目のアイテムである場合、新しいアイテムをx回追加したことになります。私はそれがあなたが必要としているものであると真剣に疑っています。リファクタリングを行うと、これはすぐに明らかになります。

于 2012-11-28T16:10:16.190 に答える
0

この問題を回避するには、List の代わりに set を使用します。変更したい同じリストを反復できます。

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

于 2012-11-28T16:13:30.947 に答える