2017-01-06 2 views
-2

У меня есть список, представляющий набор полей, которые должны быть выбраны из моей базы данных. Я передаю это классу, который я использую, чтобы построить строку выбора select. При его создании я получаю исключение ConcurrentModificationException всякий раз, когда я проверяю список # isEmpty. Я изменил его на ImmutableList, и я больше не получаю эту проблему.Отслеживание, когда коллекция была изменена (ConcurrentModificationException)

Однако это меня смущает ... Не следует ли получить исключение UnsupportedOperationException в том месте, где оно было изменено одновременно?

Line бросать исключение:

if (list.isEmpty() || ... null checks) { ... } 

Исключение:

at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231) 
at java.util.ArrayList$SubList.size(ArrayList.java:1040) 
at java.util.AbstractCollection.isEmpty(AbstractCollection.java:86) 

РЕШЕНИЕ:

Список Я проверка #isEmpty был подсписок. Главный список был отредактирован после создания подписок (для добавления некоторых обязательных полей). Это вызвало исключение ConcurrentModificationException при проверке #isEmpty. Спасибо.

ответ

1

isEmpty() никогда не должен бросать ConcurrentModificationException. Это происходит только при использовании Iterator, когда оно было изменено (и только для некоторых коллекций).

Если реализация пользовательского списка бросает это исключение, это не ожидаемое поведение, поэтому, когда вы его обертываете, я бы ожидал, чтобы больше не делать этого.

Я заменил его на ImmutableList, и я больше не получаю эту проблему.

Скорее всего, это копирование, а не упаковка вашего списка, что является еще одной причиной, по которой вы не можете увидеть это исключение. (Поскольку вы используете копию, а не мутированный оригинал)

Как я могу получить стек, который у меня есть.

Я бы назвал это ошибкой или, по крайней мере, плохим дизайном. Это не задокументировано, и, по-видимому, нет причин для этого.

Вместо того, чтобы принимать subList(), вы можете взять копию сублиста(), что, как я подозреваю, вы делаете.

+1

Итак ... тогда, полагаю, мой вопрос: как я могу получить стек, который у меня есть ... – user2303325

+0

Взятие subList()? Это java.util.ArrayList, который бросает это, а не мою собственную реализацию. – user2303325

+0

Итак, возможно, это связано, хотя: когда я изначально беру в полях, которые будут использоваться, это как большой массив. Итак, я разбиваю этот массив на меньшие списки, используя список # partition. Затем я перебираю эти списки, делая строки с инструкциями ... и когда я проверяю, есть ли список полей раздела isEmpty, я получаю исключение. – user2303325

Смежные вопросы