Java concurrentexception i don';我不明白它在哪里';什么是错误

Java concurrentexception i don';我不明白它在哪里';什么是错误,java,concurrency,Java,Concurrency,我收到这个例外 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(ServerMult

我收到这个例外

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行对应于(ItemClient itm:itemsList)的
。为什么我会收到此错误?

您正在更改for each循环中的LinkedList内容。LinkedList迭代器的实现在下一次调用next()时检查列表是否已更改并引发异常(我知道…)

增强的for循环用于迭代给定的一组值,但在迭代过程中,您修改了相同值的内容,这就是为什么会出现错误,而不是使用普通的for循环来完成这项工作


遗憾的是,没有简单的方法可以解决这个问题。正如其他人所说,您不能在这种循环中修改集合。另一个选项是使用法线for循环。但是,通过索引访问
LinkedList
,如下所示:

for(int i = 0; i < list.size(); i++) {
    list.get(i);
}
这不会引发异常,但它仍然不是一段好代码,因为您在迭代时添加到列表中,这从来都不是一个好主意

我希望你有耐心阅读到目前为止

我给您的最后一个建议是保存一个临时列表,其中包含需要添加的元素,并将它们附加到循环末尾的初始列表中。这样,您可以保留所有原始代码和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);
LinkedList tempList=新建LinkedList();
for(ItemClient itm:itemsList){
itm=itemsList.get(i);
如果(itm等于(项目)){
int value=itm.getCounter();
值++;
设置计数器(值);
println(itm.getCounter());
}否则{
item.initCounter();
圣堂武士。添加(物品);
println(“这是您第一次连接到服务器!”);
}
} 
itemsList.addAll(圣殿骑士);

不要使用for each循环,从而避免使用迭代器,如@Gagandeep-Bali-sugested…:D(使用一个简单的for循环)@Mazzy你不能改用ArrayList吗?@Mazzy:要知道列表的维度,你可以使用listObject.size()来判断可能的重复项,我认为你的算法有缺陷。您正在为列表中与新项目不匹配的每个项目向列表中添加新项目。如果你修复了这个错误(通过添加一些布尔字段
isInList
)-这也会修复这个错误。@Max我现在才意识到我犯了一个错误@Mazzy:此外,您可以删除该循环并改为编写
if(itemsList.contain(item))incrementCounter()else initCounter()
。阅读这里的
contain
method:@Max,不是真的,他正在为每个不符合条件的项目执行else代码,所以他仍然需要一个循环。
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);