Java IndexOutOfBoundsException

Erc*_*can 5 java

我做了一个小小的射击游戏..它工作正常,但我想要实施,如果火相交,他们将消失.我有两个玩家子弹和计算机项目符号列表...但如果我有更多的计算机子弹或反向.这是我的循环

     for (int i = 0; i < cb.size(); i++) {
        for (int j = 0; j < b.size(); j++) {
            if (b.get(j).rect.intersects(cb.get(i).rect)) {

                cb.remove(i);
                b.remove(j);


                continue;

            }
            if (cb.get(i).rect.intersects(b.get(j).rect)) {


                b.remove(j);
                cb.remove(i);

                continue;

            }

        }

    }
Run Code Online (Sandbox Code Playgroud)

这是我的游戏,其中包括... http://rapidshare.com/files/364597095/ShooterGame.2.6.0.jar

lor*_*zog 7

我强烈建议不要在循环内部使用for循环计数器.你现在小心了,稍后你会不会小心("让我们在这里试试黑客调试")并最终得到错误.

一种解决方案可能是:

  • 检查两个物体是否相交
  • 如果他们这样做,将引用保存到单独的列表中thingsToRemove
  • 最后,遍历thingsToRemove并删除(或设置为'null',-1或者等等)cbb列表中的相应元素


Fra*_*ank 6

正如卡尔的评论所述,第二个应该是多余的.

对于IndexOutOfBounds异常,这是由以下原因引起的:当计算机项目符号弹出播放器项目符号时,您将从列表中删除它们.continue然后使用您继续将相同的计算机项目符号与剩余的玩家子弹进行比较.但是,之前已经删除了该计算机子弹!因此,我建议您break代替continue,然后检查下一个计算机项目符号与玩家项目符号的交集.

正如罗马暗示他的代码,你应该进一步减少外环的计数器,因为你通过删除其中一个项目符号减少了列表大小.因此,曾经是子弹#3的是在下一次迭代中,之前是子弹#4.所以在break你不想要外循环计数器的增量之后.