forEach时候,Exception in thread “AWT-EventQueue-0“ java.util.ConcurrentModificat

news2025/1/19 20:31:50

问题分析:

        在很多容器中,都有一个变量记录你从结构上修改此容器的次数,叫做modCount,查看ArrayList的add()和remove()方法就可以发现,每次你调用add方法()向容器里面增加了一个元素,或者你调用Remove()方法删除了其中的某个元素,这个值都会增加1。在对集合进行迭代的时候,这个值不能被改变,否则抛出异常ConcurrentModificationException。简单地说就是你在遍历的时候,你自己不会去改变这个值,但是你在遍历的过程中发现这个值被改变了,那只有一种解释,其他人修改了集合导致这个值改变了。

每次循环都会经过两步操作:

        1.是iterator.hasNext() ,判断是否有下一个元素;当我们调用list.Iterator()返回一个Iterator之后,会通过Iterator的hashNext()方法判断是否还有元素未被访问

        2.是iterator.next(),判断下一个元素是什么,并且进行赋值操作;

在next方法中会调用checkForComodification方法,在checkForComodification()方法中,判断了modCount和expectedModCount是否相等。如果不相等,就会抛出我们遇到的这个异常

        在大多数情况下,foreach循环比for循环更加简洁、易读,可以提高代码的可维护性和可读性。但是,在处理大量数据时,for循环通常比foreach循环更高效。原因在于,在foreach循环中,编译器会为每个元素创建一个临时变量,这会导致额外的内存开销和CPU消耗。而在for循环中,我们可以手动控制循环的次数,从而避免了这种额外的开销。

        我们正常编码的时候喜欢用 超级for循环 和 foreach 看起来更简洁,这样,使用Iterator进行迭代的时候,如果同时移除其中的元素,会抛出 java.util.ConcurrentModificationException异常。因为我们使用Iterator进行迭代的同时,移除了 其中的对象,破坏了Iterator内部用来迭代的索引。所以抛出异常。

        最近在写坦克大战的时候就遇到了这个问题,我都用的forEach遍历坦克,每次坦克消亡的时候,remove掉毁坏的坦克,就会报这个错误,查阅了很多资料,才找到原因,既然找到了原因就可以解决问题

解决方案:

就是改为最基本的for循环,控制角标的那种

//画爆炸
        for (int i = 0; i < bombs.size(); i++) {
            Bomb bomb = bombs.get(i);
            if(bomb.life > 6){
                g.drawImage(image1, bomb.x-10,bomb.y-10,TankConstant.TANK_WHEEL_HEIGHT+20,TankConstant.TANK_WHEEL_HEIGHT+20,this);
            }else if(bomb.life > 3){
                g.drawImage(image2, bomb.x-10,bomb.y-10,TankConstant.TANK_WHEEL_HEIGHT+20,TankConstant.TANK_WHEEL_HEIGHT+20,this);
            }else{
                g.drawImage(image3, bomb.x-10,bomb.y-10,TankConstant.TANK_WHEEL_HEIGHT+20,TankConstant.TANK_WHEEL_HEIGHT+20,this);
            }
            //减少生命周期
            bomb.lifeDown();
            //生命周期结束,移除爆炸
            if(bomb.life == 0){
                bombs.remove(bomb);
            }
        }

        //遍历敌人的坦克:
        for (int j = 0; j < enemyTankVector.size(); j++) {
            EnemyTank enemy = enemyTankVector.get(j);
            //存活就画
            if (enemy.isLive) {
                drawTank(enemy.getX(), enemy.getY(), g, enemy.getDirect(), TankConstant.TANK_TYPE_ENEMY);
                //画敌人的子弹
                for (int i = 0; i < enemy.getShots().size(); i++) {
                    Shot shot = enemy.getShots().get(i);
                    //子弹存活就绘制,否则就从集合中去除
                    if (shot.isLive) {
                        g.fillOval(shot.getX(), shot.getY(), TankConstant.TANK_BARREL_WIDTH, TankConstant.TANK_BARREL_WIDTH);
                    } else {
                        enemy.getShots().remove(shot);
                    }
                }
                //否则就去除已经死掉的坦克
            } else {
                enemyTankVector.remove(enemy);
            }
        }

然后问题就解决了:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/895895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一博 - MPP(Massively Parallel Processing,大规模并行处理)架构

文章目录 概述优点缺点小结 概述 MPP&#xff08;Massively Parallel Processing&#xff0c;大规模并行处理&#xff09;架构是一种常见的数据库系统架构&#xff0c;主要用于提高数据处理性能。它通过将多个单机数据库节点组成一个集群&#xff0c;实现数据的并行处理。 在 …

PAT 1018 Public Bike Management

个人学习记录&#xff0c;代码难免不尽人意。 There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city. The Pu…

微服务基础概念【内含图解】

目录 拓展补充&#xff1a; 单体架构 分布式架构 面向服务的体系结构 云原生 微服务架构 什么是微服务&#xff1f; 微服务定义 拓展补充&#xff1a; 单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;最终打成一个包部署 优点&#x…

Hlang--用Python写个解释器

文章目录 前言流程数学解释器结果封装数的操作运行时异常运行解释实现总结前言 没错今天提前来做这个东西,昨天晚上干这个玩意差不多干了两个多小时才搞定,导致凌晨2点才睡觉,最要命的是,写着写着突然想到有一道线代理解错了,一个晚上,做梦全是这两个东西。尤其是晚上效…

一篇学会软硬链接|快捷方式|操作系统|centos7

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/categ…

安装和配置 Ansible

安装和配置 Ansible 按照下方所述&#xff0c;在控制节点 control.area12.example.com 上安装和配置 Ansible&#xff1a; 安装所需的软件包 创建名为 /home/curtis/ansible/inventory 的静态清单文件&#xff0c;以满足以下要求&#xff1a; node1 是 dev 主机组的成员 node2 …

【C语言】字符串和内存函数的介绍 -- 详解

重点介绍处理字符和字符串的库函数的使用和注意事项。 C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数。 一、求字符串长度⚪strlen …

LC-对称二叉树

LC-对称二叉树 链接:https://leetcode.cn/problems/symmetric-tree/description/ 描述&#xff1a;给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 例1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 例2&#xff1a; 输入&…

【C++】—— 详解AVL树

目录 序言 &#xff08;一&#xff09;AVL树的概念 1、AVL树的由来 2、AVL树的特点 3、平衡因子 &#xff08;二&#xff09;AVL树的插入 1、插入操作的思想理解 2、AVL树的旋转 1️⃣ LL平衡旋转&#xff08;右单旋转&#xff09; 2️⃣ RR平衡旋转&#xff08;左单…

基于Canal实现MySQL 8.0 数据库数据同步

前言 服务器说明 主机名称操作系统说明192.168.11.82Ubuntu 22.04主库所在服务器192.168.11.28Oracle Linux Server 8.7从库所在服务器 版本说明 <span style"color:#000000"><span style"background-color:#ffffff"><code class"la…

carla中lka实现(二)

前言&#xff1a; 首先计算之前检测出来的车道线的中线与输入图像的中线进行计算距离&#xff0c;&#xff0c;并设置不同的阈值对于不同的方向进行相关的调整。 一、车辆中心线 一般而言将摄像头架设在车辆的正中心轴上&#xff0c;所获得的图像的中间线极为车辆的中心。 …

激光雷达 01 线数

一、线数 对于 360 旋转式和一维转镜式架构的激光雷达来说&#xff0c;有几组激光收发模块&#xff0c;垂直方向上就有几条线&#xff0c;被称为线数。这种情况下&#xff0c;线数就等同于激光雷达内部激光器的数量[参考]。 通俗来讲&#xff0c;线数越高&#xff0c;激光器的…

Adobe Acrobat 无法使用 PS 编辑图片 的解决方法

问题描述 使用较新版本的Adobe Acrobat时&#xff0c;有时会遇到问题。 比如对pdf中的图片使用 PS 进行编辑&#xff0c;会弹出以下窗口&#xff0c;导致打不开 PS &#xff0c;无法对图片进行编辑。 Adobe 无法启动您指定的图像编辑应用程序。请在"首选项"的"…

【STM32CubeMX】低功耗模式

前言 本文讲解STM32F10X的低功耗模式&#xff0c;部分资料参考自STM32手册。STM32F10X提供了三种低功耗模式&#xff1a;睡眠模式&#xff08;Sleep mode&#xff09;、停机模式&#xff08;Stop mode&#xff09;和待机模式&#xff08;Standby mode&#xff09;。这些低功耗模…

双环传动CIO吴学信:数字化转型为企业高效运转和业绩腾飞提供重要支撑

引言 浙江双环传动机械股份有限公司&#xff08;股票代码&#xff1a;002472&#xff09;创建40年来专注于机械传动核心部件——齿轮及其组件的研发、制造与销售&#xff0c;已成为全球最大的专业齿轮产品制造商和服务商之一。 2019年以来&#xff0c;双环传动与纷享销客CRM建…

【0Ω电阻在PCB板中的5大常见作用】

文章目录 前言1、充当跳线2、进行调试时的前后级隔离3、让调试更灵活4、方便测试电流5、用于单点接地 前言 在PCB板中&#xff0c;时常见到一些阻值为0Ω的电阻。我们都知道&#xff0c;在电路中&#xff0c;电阻的作用是阻碍电流&#xff0c;而0Ω电阻显然失去了这个作用。那…

LC-将有序数组转换为二叉搜索树

LC-将有序数组转换为二叉搜索树 链接&#xff1a;https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索…

new String()到底创建了几个对象

题目&#xff1a; new String&#xff08;"abc"&#xff09;会创建几个对象&#xff1f; 看字节码&#xff0c;就知道是两个。

经验分享丨HR告诉你:同样是找工作,这些简历绝对会被直接刷掉!

上次的文章分享了自己软件测试面试时的一些经历&#xff0c;今天我想分享一下自己当时写简历以及投简历方面的经历&#xff0c;本文内容纯粹是个人简单分享&#xff0c;如果有写得不好的地方还请读者包涵与指正。 我是去年的九月初开始投递简历的&#xff0c;貌似各行各业的人都…

[JavaWeb]【七】web后端开发-MYSQL

前言&#xff1a;MySQL是一种流行的关系型数据库管理系统,它的作用是存储和管理数据。在Web开发中,MySQL是必备的数据库技能之一,因为它可以帮助Web开发人员处理大量的数据,并且提供了强大的数据查询和管理功能。 一 数据库介绍 1.1 什么是数据库 1.2 数据库产品 二 MySQL概述…