Java ConcurrentModificationException для метода List.addAll без зацикливания - PullRequest
0 голосов
/ 10 апреля 2020

У меня возникло исключение ConcurrentModifcationException для следующего фрагмента, который не имеет смысла, исходя из того, что я прочитал о причинах этой ошибки (изменение чего-то, над чем у вас есть открытый итератор):

    List<Field> kibanaFields = Arrays.asList(KibanaRow.class.getSuperclass().getDeclaredFields());
    kibanaFields.addAll(Arrays.asList(KibanaRow.class.getDeclaredFields()));

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

Цель здесь - получить список имена полей, а затем добавить значение @JsonProperty аннотации к каждому из полей KibanaRow.

1 Ответ

1 голос
/ 10 апреля 2020

Я не понимаю конкретной причины CME. Если вы покажете нам трассировку стека, мы сможем ее обработать ....

Однако то, что вы пытаетесь сделать , все равно не будет работать :

List<Field> kibanaFields 
        Arrays.asList(KibanaRow.class.getSuperclass().getDeclaredFields());

Это создает список, поддерживаемый массивом. Размер списка фиксирован. Элементы не могут быть добавлены или удалены.

kibanaFields.addAll(Arrays.asList(KibanaRow.class.getDeclaredFields()));

Если KibanaRow.class.getDeclaredFields() возвращает непустой массив, то это попытается добавить дополнительные элементы к kibanaFields. Не может Исключение следует .

Одним из решений проблемы, которую я определил , является копирование содержимого результата asList в новый ArrayList; например,

List<Field> kibanaFields = new ArrayList<>(Arrays.asList(....));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...