forLoop中的Java ArrayList超出范围

时间:2015-05-22 22:55:57

标签: java arrays eclipse list

for(int i1 = schuss.size()-1; i1 >= 0; i1--){
    for(int i2 = (monster.size()-1) ; i2 >= 0; i2--){
        if(monster.get(i2).getBounding().intersects(schuss.get(i1).getBounding())){
            monster.get(i2).life--;
            if(monster.get(i2).life <= 0){
                    monster.remove(i2);
            }
            schuss.remove(i1);
        }
    }
}

我总是得到一个例外,我无法理解为什么?

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 19, Size: 19
at java.util.LinkedList.entry(LinkedList.java:365)
at java.util.LinkedList.get(LinkedList.java:315)
at Defender_Pack.GameFrame.update(GameFrame.java:139)
at Defender_Pack.MainMethod.main(MainMethod.java:27)

如何在没有超出界限的情况下完成所有这些操作Exception以及为什么我会得到一个因为我认为我只要求索引绑定!

3 个答案:

答案 0 :(得分:1)

i1被设置为outter循环中schuss的最后一个元素,但是在内循环中删除了一个元素。 i1不会被递减直到内循环完成,所以在第二次通过内循环时,i1现在已经超出界限。

我不确切地知道你想要完成什么,但是你应该将schuss.remove移到内循环之外:

for(int i1 = schuss.size()-1; i1 >= 0; i1--){
    for(int i2 = (monster.size()-1) ; i2 >= 0; i2--){
        if(monster.get(i2).getBounding().intersects(schuss.get(i1).getBounding())){
            monster.get(i2).life--;
            if(monster.get(i2).life <= 0){
                    monster.remove(i2);
            }

        }
    }
    schuss.remove(i1);
}

答案 1 :(得分:1)

按照上面的评论中的建议,在循环外进行删除。

List<Schuss> tempSchuss = new ArrayList<Schuss>(schuss);
List<Monster> tempMonster = new ArrayList<Monster>(monster);
for(int i1 = schuss.size()-1; i1 >= 0; i1--){
    for(int i2 = (monster.size()-1) ; i2 >= 0; i2--){
        if(monster.get(i2).getBounding().intersects(schuss.get(i1).getBounding())){
            monster.get(i2).life--;
        if(monster.get(i2).life <= 0){
            tempMonster.remove(i2);
        }
        tempSchuss.remove(i1);
        }
    }
}
schuss = tempSchuss;
monster = tempMonster;

我认为你有Monster和Schuss的课程

答案 2 :(得分:0)

问题应该在以下几行:

schuss.remove(i1);

事实上 i1th 元素在你没有完成时被删除:下一个&#34;怪物&#34; 内部循环可能会尝试访问它。< / p>

修复程序取决于代码的目标,但添加

break;
在提到的指示之后,可以提供帮助。