使用增强for循环抛出的一个异常

前言:

遍历集合根据某个条件对集合内容进行增加或者删除,但是前几天使用增强for循环遍历集合并把集合中的某些元素删除的时候会抛出异常:ConcurrentModificationException

如图所示

 解决方法:

把增强for循环改成普通for循环,按索引取出对象

下面两段代码均为调用了hitTank方法,hitTank方法里有remove方法,会实时改变enemyTank集合的元素

    public void hitTank(Shot shot,EnemyTank enemyTank){
        //判断子弹的横纵坐标是否和敌方坦克重合
        if(shot.x > enemyTank.getX() && shot.x < enemyTank.getX() + 80
                && shot.y > enemyTank.getY() && shot.y < enemyTank.getY() + 80){
            shot.isLive = false;
            enemyTank.setLive(false);

            //remove删除集合元素的方法在这里
            enemyTanks.remove(enemyTank);

            //生命设置false后,new一个Bomb加入到Bombs中
            bombs.add(new Bomb(enemyTank.getX(), enemyTank.getY()));
        }
    }

未修改前

            if(hero.shot != null && hero.shot.isLive){
                for (EnemyTank enemyTank : enemyTanks) {
                    hitTank(hero.shot,enemyTank);
                }
            }

修改后

            if(hero.shot != null && hero.shot.isLive){
                for (int i = 0; i < enemyTanks.size(); i++) {
                    EnemyTank enemyTank = enemyTanks.get(i);
                    hitTank(hero.shot,enemyTank);
                }
            }

异常原因:

ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

原因:ArraayList迭代器有个Itr,其内部有个属性expectedModCount。而集合有个fail-fast快速失败检测机制,当进行remove()操作时,会比对expectedModCount是否与modCount相等,而前者一般不会改变,但remove操作会导致modCount发生改变。一旦两者不等,就会抛出此异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值