Запуск java.util.ConcurrentModificationException при повторении списка

Я пытаюсь разбить список записей на подсписки записей. Я успешно разбил список на подсписки, хотел посмотреть содержимое подсписков, но почему-то постоянно натыкаюсь на это ConcurrentModificationException.

Мой метод разделения:

/**
     * @param list - list of results
     * @param size - how many sublists
     * @return ret - returns a list containing the sublists
     * */
    public static <T> List<List<T>> split(List<T> list, int size) throws NullPointerException, IllegalArgumentException {
        if (list == null) {
            throw new NullPointerException("The list parameter is null.");
        }
        if (size <= 0) {
            throw new IllegalArgumentException("The size parameter must be more than 0.");
        }

        int recordsPerSubList = list.size() / size; // how many records per sublist
        List<List<T>> sublists = new ArrayList<List<T>>(size); // init capacity of sublists

        // add the records to each sublist
        for (int i=0; i<size; i++) {
            sublists.add(i, list.subList(i * recordsPerSubList, (i + 1) * recordsPerSubList));
        }

        // for the remainder records, just add them to the last sublist
        int mod = list.size() % recordsPerSubList;
        if (mod > 0) {
            int remainderIndex = list.size() - mod;
            sublists.get(size - 1).addAll(list.subList(remainderIndex, list.size()));
        }

        return sublists;
    }

Я называю это здесь:

List<List<QuoteSearchInfo>> ret = Util.split(quoteSearchInfoList, 5);

            int fileCounter = 0;
            for (List<QuoteSearchInfo> sublist : ret) {
                fileCounter++;

                String sublistJson = new Gson().toJson(sublist);
                filename = JSON_FILE_NAME + fileCounter + JSON_FILE_END;
                saveToFile(filename, sublistJson);
                AWSManager.getInstance().uploadQuoteSearchJson(filename);
            }

^ Здесь я пытаюсь разбить список на подсписки, чтобы загрузить их на S3.

и трассировка стека:

java.util.ConcurrentModificationException 
at java.util.SubList.checkForComodification(AbstractList.java:752) 
at java.util.SubList.listIterator(AbstractList.java:682) 
at java.util.AbstractList.listIterator(AbstractList.java:284) 
at java.util.SubList.iterator(AbstractList.java:678) 
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:95) 
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 
at com.google.gson.Gson.toJson(Gson.java:546)
at com.google.gson.Gson.toJson(Gson.java:525) 
at com.google.gson.Gson.toJson(Gson.java:480) 
at com.google.gson.Gson.toJson(Gson.java:460) 
at com.crover.QuoteSearchRover.execute(QuoteSearchRover.java:41) 
at com.crover.CroverMain.execute(CroverMain.java:85) 
at com.crover.CroverMain.main(CroverMain.java:35)

person iCodeLikeImDrunk    schedule 17.05.2013    source источник
comment
опубликуйте трассировку стека исключений.   -  person Aravind Yarram    schedule 18.05.2013
comment
@Pangea добавил, похоже, что что-то пошло не так, когда я пытался составить список.   -  person iCodeLikeImDrunk    schedule 18.05.2013
comment
Это исключение обычно означает, что список изменяется при повторении. Что GSON делает под капотом? Также вы можете изменить название компании на другое.   -  person zw324    schedule 18.05.2013
comment
Название компании @ZiyaoWei?   -  person iCodeLikeImDrunk    schedule 18.05.2013
comment
@ZiyaoWei, ха-ха, спасибо! не уловил этого.   -  person iCodeLikeImDrunk    schedule 18.05.2013


Ответы (1)


sublists.get(size - 1).addAll(list.subList(remainderIndex, list.size()));

sublists.get(size - 1) — это живое представление поддиапазона списка, поэтому, когда вы добавляете в него элементы, вы также добавляете элементы в исходный список, в то же время, когда вы пытаетесь получить элементы из list.subList. Как правило, вы не можете изменять список во время его повторения.

Самое простое решение — не добавлять элементы в sublists.get(size - 1), а просто обновить его:

sublists.set(size - 1, 
   list.subList(remainderIndex - recordsPerSublist, list.size()));
person Louis Wasserman    schedule 17.05.2013
comment
в настоящее время в моем коде у меня будет 5 списков, где первые 4 списка будут иметь одинаковую длину. последний (5-й) список будет содержать длину любых других списков ПЛЮС любых оставшихся записей. разве этот код не заменит 5-й список? - person iCodeLikeImDrunk; 18.05.2013
comment
Это похоже на ответ, но трассировка стека говорит, что исключение не происходит в методе split; любые комментарии? - person zw324; 18.05.2013