concurrentexception Я не понимаю, где это ошибка - PullRequest
0 голосов
/ 26 января 2012

Я получаю это исключение

Exception in thread "Thread-3" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:761)
at java.util.LinkedList$ListItr.next(LinkedList.java:696)
at ServerMultiThread.run(ServerMultiThread.java:89)
at java.lang.Thread.run(Thread.java:680)

из этого кода:

            synchronized(itemsList)
            {

                if(itemsList.isEmpty())
                {
                    item.initCounter();
                    itemsList.add(item);
                    pw.println("It's the first time you connect to server!");
                }
                else
                {

                    for(ItemClient itm : itemsList)
                    {

                    if(itm.equals(item))
                    {
                        int value = itm.getCounter();
                        value++;
                        itm.setCounter(value);
                        pw.println(itm.getCounter());

                    }
                    else
                    {
                        item.initCounter();
                        itemsList.add(item);
                        pw.println("It's the first time you connect to server!");   
                    }
                    }
                }
    }

строка 89 соответствует этому for(ItemClient itm : itemsList).Почему я получаю эту ошибку?

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Вы изменяете содержимое LinkedList внутри цикла for-each.Реализация итератора LinkedList проверяет при следующем вызове next (), изменился ли список, и выдает исключение (печально, я знаю ...).

2 голосов
/ 26 января 2012

Усовершенствованный цикл for используется для итерации по заданному набору значений, но во время итерации вы изменяете содержимое того же самого, поэтому вы получаете эту ошибку, вместо этого используйте обычный цикл for, чтобы делать свои вещи для этой вещи.,

С уважением

0 голосов
/ 26 января 2012

К сожалению, нет легкого пути обойти это.Как уже говорили другие, вы не можете изменить коллекцию внутри этого вида цикла.Другой вариант - использовать обычный цикл for.Однако для доступа к LinkedList по индексу, например:

for(int i = 0; i < list.size(); i++) {
    list.get(i);
}

, требуется O (N) времени для каждого элемента , потому что связанный список необходимо обходить каждый раз с самого начала.

Если связанный список не важен для вашего алгоритма, я предлагаю вам использовать ArrayList и изменить код следующим образом:

for(int i = 0; i < itemsList.size(); i++) {

     itm = itemsList.get(i);
     if(itm.equals(item)) {
          int value = itm.getCounter();
          value++;
          itm.setCounter(value);
          pw.println(itm.getCounter());
     } else {
          item.initCounter();
          itemsList.add(item);
          pw.println("It's the first time you connect to server!");   
     }
}    

Это не приведет к исключению,но это все еще не очень хороший кусок кода , потому что вы добавляете в список во время итерации, и это никогда не будет хорошей идеей .

Надеюсь, у вас хватит терпения читать до сих пор!

Последнее, что я могу вам предложить - это сохранить временный список элементов, которые вам нужныдобавить и добавить их в начальный список в конце цикла.Таким образом, вы можете сохранить весь свой оригинальный код и LinkedList :

LinkedList<ItemClient> tempList = new LinkedList<ItemClient>();
for(ItemClient itm: itemsList) {

     itm = itemsList.get(i);
     if(itm.equals(item)) {
          int value = itm.getCounter();
          value++;
          itm.setCounter(value);
          pw.println(itm.getCounter());
     } else {
          item.initCounter();
          tempList.add(item);
          pw.println("It's the first time you connect to server!");   
     }
} 

itemsList.addAll(tempList);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...