为什么会出现错误“ ArrayIndexOutOfBoundsException:长度= 0;索引= 0”?

时间:2019-01-25 22:08:07

标签: android

我的代码:

private Collection<Film> getFilms() {
    File files = new File(pathname);
    File[] filesList = files.listFiles();
    List<Film> list = Arrays.asList();
    Log.d("filesList.length ", ""+filesList.length);
    for (int i = 0; i < filesList.length; i++) {
        try {
            Film filmTemp = new Film(filesList[i]);
            list.set(i, filmTemp);
        } catch (Throwable e) {
            Log.d("Error!", "Kobzda", e);
        }
    }
    return list;
}

我总是得到相同的错误:

  • java.lang.ArrayIndexOutOfBoundsException:length = 0;索引= 0
  • java.lang.ArrayIndexOutOfBoundsException:length = 0;索引= 1

2 个答案:

答案 0 :(得分:0)

您正在调用没有参数的Arrays.asList(),这意味着您创建的列表是不可变的(无法添加或删除元素)并且为空。

即使List是可变的(例如,通过执行List<Film> list = new ArrayList<>()),您仍然会遇到问题,因为您无法在不存在的元素索引上调用set。换句话说,元素必须已经存在于列表中的该索引处,才能成功调用set

相反,您应该创建一个可变列表并调用add

类似的东西:

private Collection<Film> getFilms() {
    File files = new File(pathname);
    File[] filesList = files.listFiles();
    List<Film> list = new ArrayList<>();
    Log.d("filesList.length ", ""+filesList.length);
    for (int i = 0; i < filesList.length; i++) {
        try {
            Film filmTemp = new Film(filesList[i]);
            list.add(filmTemp);
        } catch (Throwable e) {
            Log.d("Error!", "Kobzda", e);
        }
    }
    return list;
}

答案 1 :(得分:0)

如果您查看List#set的文档

  

此列表中指定位置的元素替换为指定元素。

     

投掷:...

     

IndexOutOfBoundsException-如果索引超出范围(索引<0 ||索引> = size())

(添加了强调。)

因此,此方法不会在给定的索引处添加新元素,它会替换必须已经存在的元素。但是,当您使用Arrays.asList()实例化列表时,创建了一个空列表。由于索引0处没有元素,因此您无法在其中替换一个元素。

您应该使用new ArrayList<>()创建列表,然后使用List#addArrays.asList()返回一个不能向新索引添加元素的列表;其大小是固定的)。