java.lang.IndexOutOfBoundsException

时间:2014-01-02 14:12:46

标签: java arrays arraylist runtime-error indexoutofboundsexception

我使用ArrayList存储关卡中每个矩形的“阴影”,但是当我迭代这样的时候:

for(int n = 0; n < shadows.size(); ++n){
 g2d.fillPolygon(shadows.get(n)[0]);
 g2d.fillPolygon(shadows.get(n)[1]);
 g2d.fillPolygon(shadows.get(n)[2]);
 g2d.fillPolygon(shadows.get(n)[3]);
 g2d.fillPolygon(shadows.get(n)[4]);
 g2d.fillPolygon(shadows.get(n)[5]);
}

我收到java.lang.IndexOutOfBoundsException错误,如下所示:Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 42, Size: 79

为什么即使索引号不等于或大于该值,我也会得到错误?该程序仍然正常运行,但我仍然不希望它有任何错误。

我也尝试了一个强化循环,但后来我得到java.util.ConcurrentModificationException而不是

for(Polygon[] polys : shadows){
 g2d.fillPolygon(polys[0]);
 g2d.fillPolygon(polys[1]);
 g2d.fillPolygon(polys[2]);
 g2d.fillPolygon(polys[3]);
 g2d.fillPolygon(polys[4]);
 g2d.fillPolygon(polys[5]);
}

2 个答案:

答案 0 :(得分:7)

使用增强型for循环时获得ConcurrentModificationException的事实意味着另一个线程在您迭代它时修改列表。

出于同样的原因循环使用普通for循环时会出现不同的错误 - 列表大小发生变化,但只检查循环入口处的size()约束。

有很多方法可以解决这个问题,但可能有一种方法可以确保对列表的所有访问都是synchronized

答案 1 :(得分:0)

您使用多个线程吗? The accepted answer in this question可能会帮助您解决IndexOutOfBoundsException。

当您尝试在迭代时修改(编辑,删除,重新排列或以某种方式更改)列表时,会引发ConcurrentModificationException。例如:

//This code would throw a ConcurrentModificationException
for(Duck d : liveDucks){
    if(d.isDead()){
        liveDucks.remove(d);
    }
}

//This could be a possible solution
for(Duck d : liveDucks){
    if(d.isDead()){
        deadDucks.add(d);
    }
}

for(Duck d : deadDucks){
    liveDucks.remove(d);  //Note that you are iterating over deadDucks but modifying liveDucks
}