java - 由于运行时对列表的更改而导致的每个超出范围
问题描述
有一个基类,其中包含一个子类作为成员。在所述子类中,我有一个方法,其中有一个 for each 循环,我在其中运行一个列表并在所述列表中的每个变量上运行一个方法。在所述列表中,有两个对象可能会或可能不会从基类的列表中删除对象。问题是由于某种原因,每当所述两个对象从列表中删除一个元素时,循环就会崩溃。有趣的是,由于某种原因,只有当第二个对象从列表中删除一个元素时,程序才会崩溃。我尝试添加更多这样的变量,由于某种原因,只有倒数第二个对象可以从列表中删除元素而不会导致程序崩溃。希望对此事有所帮助。添加了一些基本代码:
public class Game {
private SpriteCollection sprites;
public void initialize() {
sprites.addelement(e1);
sprites.addelement(e2);
sprites.addelement(remover removerElement1);
sprites.addelement(remover removerElement2);
}
public class spriteCollection {
public java.util.List<Sprite> sprites;
public void notifyAllTimePassed() {
for (Sprite c : sprites) { // for each sprite
c.timePassed(); // move it
}
}
}
public class remover {
public void timePassed() {
removesprite(e1, game) // removing the element from the game which
// contains the sprite collection the remover element is a part of
}
}
解决方案
在尝试调试事物时,我找到了一个相当方便的解决方案。我没有使用 for each 循环,而是选择使用迭代器,并发现它要简单得多。所需要的只是:
for (Sprite c : sprites) { // for each sprite
c.timePassed(); // move it
}
与
for (int i = 0; i < sprites.size(); i++) {
Sprite tempSprite = sprites.get(i);
tempSprite.timePassed();
}
这样如果大小减小,整个事情就会立即停止,而不是运行一个空索引。解决方案相当平庸,老实说,我很惊讶我一直坚持这么久。
推荐阅读
- java - 模拟器视图只显示来自 sw320dp 的值?
- knex.js - 使用 max() 实现 havingRaw() 时出错
- python - 使用 python 的 excel 工作表
- r - 我希望使用 ggplot 和 dplyr 将我的数据百分比是/否作为每人一个栏
- c# - 显示验证错误的工具提示适用于绑定到 POCO 的 TextBlock,但不适用于 POCO 中的 Property。为什么?
- c# - 如何在网格单元格中为项目设置动画?
- python - python - 如何附加到字典名称是变量的字典
- sql-server - 链接表在Access前端、SQL后端是如何工作的?
- wordpress - WordPress 帖子可以显示其他自定义帖子吗?
- javascript - 画布动画 / reactjs / 带有 requestAnimationFrame