Почему я получаю сообщение об ошибке "ArrayIndexOutOfBoundsException: length=0; index=0"?

Мой код:

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: длина = 0; индекс=0
  • java.lang.ArrayIndexOutOfBoundsException: длина = 0; индекс=1

Может быть актуально - я чувствую, что использование Arrays.asList() является частью проблемы? stackoverflow.com/questions/16748030/…

aug 25.01.2019 23:17

Вы можете обратиться к stackoverflow.com/a/5554781/6818446

S. Czop 25.01.2019 23:20
0
2
1 951
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы вызываете Arrays.asList() без параметров, что означает, что создаваемый вами список неизменен (не может добавлять или удалять элементы) и пуст.

Даже если бы список был изменяемым (скажем, при выполнении 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;
}

Если вы посмотрите документы для List#set

Replaces the element at the specified position in this list with the specified element.

Throws: ...

IndexOutOfBoundsException - if the index is out of range (index < 0 || index >= size())

(Выделение добавлено.)

Таким образом, этот метод не добавляет новый элемент по заданному индексу, он заменяет элемент, который уже должен быть там. Но когда вы создавали список с помощью Arrays.asList(), вы создавали пустой список. Поскольку в индексе 0 нет элемента, вы не можете заменить его там.

Вы должны создать список с помощью new ArrayList<>(), а затем использовать List#add (Arrays.asList() возвращает список, который не может добавлять элементы в новые индексы; его размер фиксирован).

Другие вопросы по теме

Похожие вопросы

Как изменить содержимое действия из IntentService, запущенного из другого действия?
Консоль Google Play запрещает загрузку или продвижение новых версий приложений в соответствии с конфиденциальной политикой разрешений
Веб-приложение скрывает панель навигации Android (виртуальную кнопку «Назад», домашний экран и т. д.) в Chrome (через javascript)
Как передать изменяющееся число в другой класс, чтобы он выполнял команду каждый раз, когда эта переменная изменяется?
Заполнить элемент RecyclerView данными из двух таблиц базы данных
Переключение между полноэкранным и не полноэкранным режимами, вызывающее смещение просмотра
Игра собрана с помощью Unity, но когда игра развернута на Android-устройстве, она внезапно закрывается
Когда доступно несколько биометрических датчиков, как выбрать предпочтительный тип для использования?
MVP с интерактором и репозиторием + rxjava 2. Где вызыватьObservOn и SubscribeOn
Передача Android BLE прервана следующей строкой