java - 有什么简单的方法来处理这个java游戏中的ConcurrentModificationException吗?

标签 java arraylist bluej concurrentmodification

我试图用 Java 构建一个简单的剪刀石头布游戏。基本上,这个想法是,当玩家做出错误的举动时,他们就会被淘汰。最后剩下的玩家就是获胜者。 我比较缺乏经验,了解的也不是很多。我在运行它时遇到了这个 ConcurrentModification 异常。我试着用谷歌搜索了一下,但没有得到任何简单的解决办法。有一些关于迭代器之类的东西的讨论,我不太了解/理解。

我尝试了如下 -

GameStarter 类:

public class GameStarter
{
    public static void main(String[] args)
    {

    RPS g = new RPS();
    g.play();
    }
}

RPS 级别:

import java.util.ArrayList;
public class RPS
{
   Player p1 = new Player(" A ");
   Player p2 = new Player(" B ");
   Player p3 = new Player(" C ");
   Player p4 = new Player(" D ");
   Player p5 = new Player(" E ");
   ArrayList<Integer> hold =new ArrayList<Integer>();
   ArrayList<Player> active = new ArrayList<Player>();
   {
    active.add(p1);
    active.add(p2);
    active.add(p3);
    active.add(p4);
    active.add(p5);
        }
   public void play()
   {
    int i,j;
    while(active.size()>1)
    {

     for(Player p:active)
    {
    System.out.print("\n Currently active players are: "+p.name+" , ");
    }   
    System.out.println("\n\n");
    for(Player p:active)
    {
    p.rpsThrow();
    hold.add(p.cur);
    }

    if(hold.contains(1) && hold.contains(2) && !hold.contains(3))
    {
    for(Player p: active)
    {
        if(p.cur==1)
        {
        active.remove(p);
        System.out.println("Player "+p.name+" eliminated ");
        }
    }

    }
    if(hold.contains(1) && !hold.contains(2) && hold.contains(3))
    {
    for(Player p: active)
    {
    if(p.cur==3)
        {
        active.remove(p);
        System.out.println("Player "+p.name+" eliminated ");
        }        
    }

    }
    if(!hold.contains(1) && hold.contains(2) && hold.contains(3))
    {
    for(Player p: active)
    {
        if(p.cur==2)
        {
        active.remove(p);
        System.out.println("Player "+p.name+" eliminated ");
        }
    }

    }

    hold.clear();
    try
    {
    Thread.sleep(3500);
    }
    catch(Exception ex)
    {

    }
}
if(active.size()==1)
{
for(Player p:active)
{
System.out.println("\n\n The winner is : \n"+p.name);
}
}


    }
}

和玩家类别:

public class Player
{
  String name;
  Integer cur;

  public Player(String n)
  {
    name=n;
   }
   public int rpsThrow()
   {
    int t;
    t=(int)((Math.random()*3)+1);
    cur=t;
    if(t==1)
    {
        System.out.println("\n"+name+" throws : rock");
    }
    else if(t==2)
    {
        System.out.println("\n"+name+" throws : paper");
    }
    else
    {
        System.out.println("\n"+name+" throws : scissors");
    }
    return t;    
    }
}

有没有什么简单的方法可以解决这个CMException?请随意修改我的代码来解决它。

最佳答案

基本上,一旦你开始在 Collection 上使用迭代器(并且这种类型的 for 循环使用迭代器),你就无法修改底层集合,直到你完成迭代器,否则你将得到一个 CME。如果你想从集合中删除项目,你需要使用显式迭代器并使用它的remove()方法,如下所示:

public static void main(String[] args) throws Exception {
    List<String> vals = new ArrayList<>();
    vals.add("1"); vals.add("2"); vals.add("3");

    // This throws a CME
    for(String s: vals) {
        if("1".equals(s)) {
            vals.remove(s);
        }
    }

    // This would work
    for(Iterator i = vals.iterator(); i.hasNext(); ) {
        if("1".equals(i.next())) {
            i.remove();
        }
    }
}

关于java - 有什么简单的方法来处理这个java游戏中的ConcurrentModificationException吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27361711/

相关文章:

java - 如何使用以下 Pen 类和 canvas 类在 Java 中绘制螺旋和多边形

java - 无法发现程序中的空异常

java - 我应该如何进行或不应该进行单元测试?

java - Android SDK Eclipse Debug模式

java - 在 Spring Batch 中将当前时间戳作为作业参数传递

android - 如何将数组列表与移动联系人进行比较

java - 如何在 OpenJDK 中禁用自旋锁同步

java - 形状数组列表

java - 如何使用 StackMob 查询列表填充 listView

java - 如何安装 OpenJFX 11