java - 使用正确的 remove() 方法时显示 java.util.ConcurrentModificationException
问题描述
当 isActive 为假时,我试图删除一个实体。当实体属性 isActive 设置为 false 时,它进入 if 语句并删除实体,之后再次遍历实体列表然后崩溃。根据我的研究,我正在使用正确的方法从数组列表中删除对象。
删除实体并遍历列表时的代码是
for (Entity entity : entities) {// itaarate through all the entities in list of entities
entity.render(shader, camera, this);// render each entity
if (!entity.isActive())// checks if entity attribute is active
entities.remove(entity);// removes entity from list
}
在从列表中删除实体后使用调试器时,它会返回到 for 循环的顶部,然后显示此页面
调试时的变量窗口
控制台中显示的完整错误是
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at project.World.render(World.java:196)
at project.Main.<init>(Main.java:152)
at project.Main.main(Main.java:167)
正在创建的列表是
public static ArrayList<Entity> entities; // contains all entities
解决方案
java.util.ConcurrentModificationException
使用正确remove()
方法时显示
实际上,您使用的是错误的方法。或者更准确地说remove()
是错误对象上的方法。
您可以在迭代时删除元素......但您需要remove()
在对象上使用该方法Iterator
;有关更多详细信息,请参阅javadoc。
Iterator<Entity> it = entities.iterator();
while (it.hasNext()) {
Entity entity = it.next();
entity.render(shader, camera, this);
if (!entity.isActive()) {
it.remove();
}
}
请注意,这Iterator.remove()
是一个可选操作,但ArrayList
迭代器确实实现了它。
ListIterator
API 具有相同的方法,但更Iterator
通用。(您可以将上述示例代码用于任何可以使用 迭代的类型Iterator
,而不仅仅是List
类型。)
推荐阅读
- json - Spring MVC - 格式化为 JSON 的数据页,出现错误:无法推断 ResponseEntity<> 的类型参数
- java - 如何使用 putExtra() 和 getExtras() 代码获取 int 值?
- dart - Flutter 从 Firebase 存储中获取下载 URL
- python - 使用 Django / virtualenv 运行 celery 时找不到“__main__”模块
- c# - 创建宏时如何区分两个同名窗口
- angular - NGRX 角载荷或无载荷
- node.js - 更新 apollo-server-lambda npm 后,无服务器 lambda 不起作用
- android - 约束 2 个视图时的 ConstraintLayout 奇怪的属性行为
- java - 尝试读取文件时出现奇怪的 NoSuchFileException
- javascript - javascript中日期范围内的每小时分钟数