java.util.ConcurrentModificationException после перебора списка объектов

Мое приложение регистрирует данные о входящих телефонных звонках и смс за определенные даты и хранит их в списке. Я хочу, чтобы приложение проверяло, есть ли уже запись для этой даты, когда поступает новый телефонный звонок или смс. Если это так, я хочу, чтобы приложение увеличивало значение в списке.

Однако, когда я пытаюсь это сделать, я получаю эту ошибку: java.util.ConcurrentModificationException

Как я могу решить эту проблему?

Мои коды выглядят так

    public void addLog(String phonenumber, String type, long date, int incoming, int   outgoing)
{
    //Check if log exists or else create it.
    Log newLog = new Log(phonenumber, type, date, incoming, outgoing);

    //Iterates through logs
    for (Log log : logs)
    {
        if (log.getPhonenumber() == phonenumber && log.getDate() == date && log.getType() == type)
        {
            updateLog(newLog, log.getId());
        }
        else
        {
            android.util.Log.i("Datamodel", "Adding log");
            logs.add(newLog);
            //add to database
        }
    }
}

public void updateLog(Log newLog, long id)
{

    //check for outgoing or incoming
    if (newLog.getIncoming() == 1)
    {
        for (Log log : logs)
        {
            if (log.getId() == id)
            {
                //Increments incoming
                int incoming = log.getIncoming();
                android.util.Log.i("Datamodel", "Updating incoming");
                log.setIncoming(incoming++);
            }
            else
            {
                //Increments outgoing
                int outgoing = log.getOutgoing();

                android.util.Log.i("Datamodel", "Updating outgoing");
                log.setOutgoing(outgoing++);
            }
        }
    }
    //Update the list
    //Add to database
}

person Frederikkastrup    schedule 29.09.2013    source источник
comment
Обычно CME происходит, если вы меняете значение чего-то в итерируемом объекте, с которым вы работаете, во время итерации по нему.   -  person Rogue    schedule 29.09.2013
comment
Ваша проблема никак не связана с Android. Поэтому лучше сначала выполнить поиск на этом сайте, используя тег Java. Вы бы нашли много советов.   -  person A.H.    schedule 29.09.2013


Ответы (1)


Цикл for, такой как ваш for (Log log : logs), на самом деле использует Iterator внизу для перебора элементов в Collection (где logs — это ваш Collection в данном случае).

Общеизвестным фактом о Iterator является то, что вы не должны пытаться модифицировать Collection, пока вы зацикливаетесь или перебираете его; в противном случае это приведет к ConcurrentModificationException.

Уже есть большое количество вопросов и ответов по SO относительно Iterator и CME, поэтому вместо того, чтобы дублировать советы, я советую посмотреть предлагаемые решения здесь.

person Trevor    schedule 29.09.2013