有人可以帮助我解决这个问题。这是我收到的错误消息:
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();
这段代码的想法是屏幕两边的房屋不断下降。
任何帮助将不胜感激:)
答案 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);