无法运行我的代码:java.lang.IndexOutOfBoundsException:Index:0,Size:0

时间:2014-06-20 17:18:10

标签: android loops arraylist libgdx indexoutofboundsexception

有人可以帮助我解决这个问题。这是我收到的错误消息:

Exception in thread "LWJGL Application" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:635)
    at java.util.ArrayList.get(ArrayList.java:411)
    at com.mygdx.Papermadness.Papermadness.render(Papermadness.java:102)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:206)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)

这是我通过huisArray(huis = house)循环的代码。

private ArrayList<Sprite> huisArray = new ArrayList<Sprite>();

spriteBatch.begin();

    sprite.draw(spriteBatch);



     for (int i = 0; i < huisArray.size(); i++) {
            huisArray.get(i).setY(huisArray.get(i).getY() - huisVelocity * delta);

                 if (huisArray.get(i).getY() <= 200) {
                huisArray.remove(huisArray.get(i));
            } 

        }


      if (huisArray.get(0).getY() < 1200) {
            addNewHuis();
        }

     huisBatch.begin();

     for (int i = 0; i < huisArray.size(); i++) {
            huisArray.get(i).setY(huisArray.get(i).getY() - huisVelocity * delta);

                 if (huisArray.get(i).getY() <= 200) {
                huisArray.remove(huisArray.get(i));
            } 

        }


      if (huisArray.get(0).getY() < 1200) {
            addNewHuis();
        }

     huisBatch.begin();


      for (int i = 0; i < huisArray.size(); i++) {
            huisBatch.draw(huisArray.get(i), huisArray.get(i).getX(), huisArray.get(i).getY());
        }
spriteBatch.end();
    huisBatch.end();

这段代码的想法是屏幕两边的房屋不断下降。

任何帮助将不胜感激:)

3 个答案:

答案 0 :(得分:1)

您的错误可能就在这里:

if (huisArray.get(0).getY() < 1200) { 

如果huisArray的大小为零,那么从中获取一个对象将引发异常。您应首先检查其中是否包含任何内容,如下所示

if (huisArray.size() > 0 && huisArray.get(0).getY() < 1200) {

答案 1 :(得分:1)

问题是huisArray为空,您从此列表中获取值

  if (huisArray.get(0).getY() < 1200) {

首先在huisArray中检查huisArray中的项目之前添加private ArrayList<Sprite> huisArray = new ArrayList<Sprite>(); // Add huisArray item here as huisArray.add(addspritehere); 中的项目

  if (huisArray.get(0).getY() < 1200) {

或更改

if (huisArray.size() > 0 && huisArray.get(0).getY() < 1200) {

{{1}}

答案 2 :(得分:0)

下面:

if (huisArray.get(0).getY() < 1200) {
        addNewHuis();
    }

您正在访问huisArray中的第一个元素,但从不检查它是否为空。

之前添加尺寸检查:

if (huisArray.size > 0 &&huisArray.get(0).getY() < 1200) {
        addNewHuis();
    }

你的for循环中还有另一个问题:

for (int i = 0; i < huisArray.size(); i++) {
        huisArray.get(i).setY(huisArray.get(i).getY() - huisVelocity * delta);

             if (huisArray.get(i).getY() <= 200) {
            huisArray.remove(huisArray.get(i));
        } 

    }

如果您删除for循环中的内容,那么您将忽略某些项目:

让我们说你的阵列有3个元素[A,B,C],第一个元素有条件要删除。

所以在第一个循环中,您将拥有:

i = 0 array = [A,B,C]

删除A,第二个循环开始

i = 1 array = [B,C]

现在看到你检查C(位于第1位),你永远不会检查B

为了避免这种情况(使用那种for循环),只需添加:

for (int i = 0; i < huisArray.size(); i++) {
        huisArray.get(i).setY(huisArray.get(i).getY() - huisVelocity * delta);

             if (huisArray.get(i).getY() <= 200) {
            huisArray.remove(huisArray.get(i));
            i--;
        } 

    }

另外作为建议,如果您知道要删除的项目的位置,请通过索引删除它而不是按对象删除(它更快)

huisArray.remove(i);