在这个java游戏中,有没有简单的方法来处理ConcurrentModificationException?

在这个java游戏中,有没有简单的方法来处理ConcurrentModificationException?,java,arraylist,bluej,concurrentmodification,Java,Arraylist,Bluej,Concurrentmodification,我试图用Java开发一个简单的石头剪刀游戏。基本上,这个想法是当玩家做出错误的动作时,他们会被淘汰。剩下的最后一名选手是胜利者。 我相对缺乏经验,知道的也不多。我在运行ConcurrentModification时遇到了这个异常。我试着用谷歌搜索一下,但没有得到任何简单的解决办法。有关于迭代器之类的讨论,我不太了解 我试了一下如下- GameStarter类: public class GameStarter { public static void main(String[] args

我试图用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);
}
}


    }
}

有没有简单的方法来解决这个异常?请随意修改我的代码以解决此问题。

在循环中使用
迭代器
,在循环中修改当前迭代的集合

for(Iterator iter = active.iterator(); iter.hasNext();)
{
    Player p = (Player)iter.next();
    if(p.cur==1)
    {
    iter.remove();
    System.out.println("Player "+p.name+" eliminated ");
    }
}

在循环中使用
iterator
,在循环中修改当前迭代的集合

for(Iterator iter = active.iterator(); iter.hasNext();)
{
    Player p = (Player)iter.next();
    if(p.cur==1)
    {
    iter.remove();
    System.out.println("Player "+p.name+" eliminated ");
    }
}

在循环中使用
iterator
,在循环中修改当前迭代的集合

for(Iterator iter = active.iterator(); iter.hasNext();)
{
    Player p = (Player)iter.next();
    if(p.cur==1)
    {
    iter.remove();
    System.out.println("Player "+p.name+" eliminated ");
    }
}

在循环中使用
iterator
,在循环中修改当前迭代的集合

for(Iterator iter = active.iterator(); iter.hasNext();)
{
    Player p = (Player)iter.next();
    if(p.cur==1)
    {
    iter.remove();
    System.out.println("Player "+p.name+" eliminated ");
    }
}

将循环的活动玩家更改为
迭代器
将循环的活动玩家更改为
迭代器
将循环的活动玩家更改为
迭代器
将循环的活动玩家更改为
迭代器
这段代码有问题:-

for(Player p: active)
{
    if(p.cur==2)
    {
    active.remove(p);
    System.out.println("Player "+p.name+" eliminated ");
    }
}
您正在对活动列表进行迭代,并从中删除该元素

您需要使用迭代器并从迭代器中删除数据,它将自动从实际列表中删除

  for(Iterator playerIterator = active.iterator(); playerIterator.hasNext();) {
   Player p = (Player)playerIterator.next();
   if(p.cur==2){
    playerIterator.remove();
   System.out.println("Player "+p.name+" eliminated ");
  }
 }

这段代码有问题:-

for(Player p: active)
{
    if(p.cur==2)
    {
    active.remove(p);
    System.out.println("Player "+p.name+" eliminated ");
    }
}
您正在对活动列表进行迭代,并从中删除该元素

您需要使用迭代器并从迭代器中删除数据,它将自动从实际列表中删除

  for(Iterator playerIterator = active.iterator(); playerIterator.hasNext();) {
   Player p = (Player)playerIterator.next();
   if(p.cur==2){
    playerIterator.remove();
   System.out.println("Player "+p.name+" eliminated ");
  }
 }

这段代码有问题:-

for(Player p: active)
{
    if(p.cur==2)
    {
    active.remove(p);
    System.out.println("Player "+p.name+" eliminated ");
    }
}
您正在对活动列表进行迭代,并从中删除该元素

您需要使用迭代器并从迭代器中删除数据,它将自动从实际列表中删除

  for(Iterator playerIterator = active.iterator(); playerIterator.hasNext();) {
   Player p = (Player)playerIterator.next();
   if(p.cur==2){
    playerIterator.remove();
   System.out.println("Player "+p.name+" eliminated ");
  }
 }

这段代码有问题:-

for(Player p: active)
{
    if(p.cur==2)
    {
    active.remove(p);
    System.out.println("Player "+p.name+" eliminated ");
    }
}
您正在对活动列表进行迭代,并从中删除该元素

您需要使用迭代器并从迭代器中删除数据,它将自动从实际列表中删除

  for(Iterator playerIterator = active.iterator(); playerIterator.hasNext();) {
   Player p = (Player)playerIterator.next();
   if(p.cur==2){
    playerIterator.remove();
   System.out.println("Player "+p.name+" eliminated ");
  }
 }

基本上,一旦开始在集合上使用迭代器(这种类型的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();
        }
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
List vals=new ArrayList();
增值税增补(“1”);增值税增补(“2”);增值税增补(“3”);
//这会引发CME
用于(字符串s:VAL){
如果(“1”。等于(s)){
VAL.移除(个);
}
}
//这会管用的
for(迭代器i=vals.Iterator();i.hasNext();){
如果(“1”。等于(i.next()){
i、 删除();
}
}
}

基本上,一旦开始在集合上使用迭代器(这种类型的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();
        }
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
List vals=new ArrayList();
增值税增补(“1”);增值税增补(“2”);增值税增补(“3”);
//这会引发CME
用于(字符串s:VAL){
如果(“1”。等于(s)){
VAL.移除(个);
}
}
//这会管用的
for(迭代器i=vals.Iterator();i.hasNext();){
如果(“1”。等于(i.next()){
i、 删除();
}
}
}

基本上,一旦开始在集合上使用迭代器(这种类型的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();
        }
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
List vals=new ArrayList();
增值税增补(“1”);增值税增补(“2”);增值税增补(“3”);
//这会引发CME
用于(字符串s:VAL){
如果(“1”。等于(s)){
VAL.移除(个);
}
}
//这会管用的
for(迭代器i=vals.Iterator();i.hasNext();){
如果(“1”。等于(i.next()){
i、 删除();
}
}
}

基本上,一旦开始在集合上使用迭代器(这种类型的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();
        }
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
List vals=new ArrayList();
增值税增补(“1”);增值税增补(“2”);增值税增补(“3”);
//这会引发CME
用于(字符串s:VAL){
如果(“1”。等于(s)){
VAL.移除(个);
}
}
//这会管用的
for(迭代器i=vals.Iterator();i.hasNext();){
如果(“1”。等于(i.next()){
i、 删除();
}
}
}

我将RPS类更改为该类(使用普通for):

包装剪刀;
导入java.util.ArrayList;
公共类RPS
{
玩家p1=新玩家(“A”);
玩家p2=新玩家(“B”);
玩家p3=新玩家(“C”);
玩家p4=新玩家(“D”);
玩家p5=新玩家(“E”);
ArrayList保持=新建ArrayList();
ArrayList active=新的ArrayList();
{
激活。添加(p1);
主动添加(p2);
激活。添加(p3);
主动添加(p4);
激活。添加(p5);
}
公共游戏
{
int i,j;