当我尝试:
//Util.java
public static ArrayList<Sprite> Load(String[] path, int numOfFiles){
ArrayList<Sprite> sprites = new ArrayList<Sprite>(numOfFiles);
Texture texture;
Sprite sprite;
for(int i = 0; i < numOfFiles; i++){
texture = new Texture(Gdx.files.internal(path[i]));
texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
sprite = new Sprite(texture);
sprite.flip(false, true);
sprites.set(i, sprite);
}
return sprites;
}
我收到错误:
Exception in thread "LWJGL Application" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
如果我打电话:
//TheGame.java
ArrayList<Sprite> sprites;
String[] filenames = {"a.png", "b.png", "c.png"};
sprites = new ArrayList<Sprite>();
sprites.addAll(Util.Load(filenames, 3));
它应该有效,因为numOfFiles
是3
。我更喜欢按照我想要的方式使用它。为什么要这样做?
在此期间我已将其更改为此内容,效果很好。
//Util.java
public static ArrayList<Sprite> Load(String[] path, int numOfFiles){
ArrayList<Sprite> sprites = new ArrayList<Sprite>();
Texture texture;
Sprite sprite;
for(int i = 0; i < numOfFiles; i++){
texture = new Texture(Gdx.files.internal(path[i]));
texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
sprite = new Sprite(texture);
sprite.flip(false, true);
sprites.add(sprite);
}
return sprites;
}
答案 0 :(得分:4)
构造函数new ArrayList<Sprite>(numOfFiles)
不创建大小为numOfFiles
的ArrayList。它创建一个大小为 0 的ArrayList,其内部数组的容量为numOfFiles
。由于列表为空,因此您无法设置元素,因为没有要设置的元素。向ArrayList构造函数提供数字的唯一目的是在列表增长时减少内部数组重新分配的优化。
您问题中的第二个代码版本是正确的。这就是你应该写它的方式。您可以选择将numOfFiles
作为优化传递给ArrayList构造函数,以确保它具有完全所需大小的数组,但您仍然必须调用add
而不是set
。
答案 1 :(得分:1)
根据Javadoc of ArrayList设置:
用此替换此列表中指定位置的元素 指定的元素。
这是IndexOutOfBoundsException
的原因,因为您在致电add
之前未致电set
。 简而言之,当调用set
方法时,您的列表仍为空。
答案 2 :(得分:0)
您得到IndexOutOfBoundsException
,因为当您尝试按sprites.set(i, sprite);