Java ArrayList - 未设置现有元素

时间:2014-11-02 16:07:02

标签: java arrays arraylist libgdx

当我尝试:

//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));

它应该有效,因为numOfFiles3。我更喜欢按照我想要的方式使用它。为什么要这样做?

在此期间我已将其更改为此内容,效果很好。

//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;
}

3 个答案:

答案 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);

替换项目时,ArrayList中没有元素