ОШИБКА ArrayList: тот же размер, содержит «нулевые» элементы после удаления () некоторые из них - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть ArrayList объектов, и иногда я звоню remove() для удаления некоторых из них.

Я заметил некоторые сообщения о NullPointerException в Google Android Developer Console, и наконец, я обнаружил, что в некоторых случаях я перебираю этот массив для доступа к объектам, и по какой-то причине после удаления некоторых объектов размер массива остается тем же, например, если массив имеет 11 элементов и я удаляю последний, он все еще имеет 11 элементов, но последний содержит ноль, поэтому, поскольку .size() возвращает 11, он дает nullpointerexception после попытки доступа к нулевому объекту, содержащемуся в последней позиции.

Почему это происходит? Как этого избежать?

РЕДАКТИРОВАТЬ: перед повторением и после удаления я объединяю три массива с "addAll ()" в смешанный, может быть, addAll копирует ошибочно удаленные нулевые ссылки?

1 Ответ

0 голосов
/ 02 февраля 2020

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

Пример для получения ошибки, о которой я сказал

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.generic;

import java.util.ArrayList;
import java.util.Scanner;

/**
 *
 * @author wilso
 */
public class prueba {

    public static void main(String[] args) {
        try {
            ArrayList<String> dta = new ArrayList<>();
            dta.add("Prueba");
            dta.add("Prueba 2");
            dta.add("Prueba 3");
            for (String tmp : dta) {
                System.out.println(tmp);
                System.out.println(tmp);
                dta.remove(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Выдает следующую ошибку

cd C: \ Users \ wilso \ OneDrive \ Documents \ NetBeansProjectsF \ OverFlow; "JAVA_HOME = C: \ Program Files \ Java \ jdk1.8.0_91" cmd / c "\" \ "C: \ Program Files \ NetBeans 8.0.2 \ java \ maven \ bin \ mvn.bat \" -Dexe c .args = \ "- classpath% classpath com.generi c .prueba \" -Dexe c .executable = \ "C: \ Program Files \ Java \ jdk1.8.0_91 \ bin \ java .exe \ "-Dexe c .classpathScope = runtime -Dmaven.ext.class.path = \" C: \ Program Files \ NetBeans 8.0.2 \ java \ maven-nblib \ netbeans-eventspy .jar \ "-Dfile.encoding = UTF-8 org.codehaus.mojo: exe c -maven-plugin: 1.2.1: exec \" "Запуск компиляции NetBeans при сохранении. Фаза выполнения пропускается, и вместо артефактов jar будут использоваться выходные каталоги зависимых проектов (с включенной компиляцией при сохранении). Сканирование проектов ...

-------------------------------------- ---------------------------------- Сборка OverFlow 1.0-SNAPSHOT

--- exe c -maven-plugin: 1.2.1: exe c (default-cli) @ OverFlow --- Prueba Prueba java .util.ConcurrentModificationException в java .util.ArrayList $ Itr.checkForComodification (ArrayList. *) 1032 *: 901) в java .util.ArrayList $ Itr.next (ArrayList. java: 851) в com.generi c .prueba.main (prueba. java: 23) ---- -------------------------------------------------- ------------------ СТРОЙ УСПЕХ ------------------------------ ------------------------------------------ Общее время: 0,748 с Окончание: Вс 2 февраля 13:55:11 COT 2020 Final

Память: 6M / 245M

...