ArrayList 错误:大小相同,在 remove() 其中一些之后包含"空"元素



我有一ArrayList对象,有时我会调用remove()删除其中一些对象。

我注意到一些关于 Google Android 开发者控制台中NullPointerException的报告,最后我发现在某些情况下,我正在迭代该数组以访问对象,并且由于某种原因,在删除一些对象后,数组的大小仍然相同,因此例如,如果数组有 11 个元素并且我删除了最后一个元素, 它仍然有 11 个元素,但最后一个包含 null,因此,当.size()返回 11 时,它会在尝试访问最后一个位置中包含的 null 对象后给出nullpointerexception

为什么会这样?如何避免这种情况?

编辑:在迭代之前和删除之后,我将三个带有"addAll(("的数组合并为一个混合数组,也许 addAll 正在复制错误删除的空引用?

您有错误,由于您正在迭代对象引用,当您删除对象时,引用等待实例是相同的。 您可以使用哈希图,它允许同时迭代和删除对象

获取我所说的错误的示例

/*
* 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\" -Dexec.args=\"-classpath %classpath com.generic.prueba\" -Dexec.executable=\"C:\Program Files\Java\jdk1.8.0_91\bin\java.exe\" -Dexec.classpathScope=runtime -dmaven.ext.class.path=\"C:\Program Files\NetBeans 8.0.2\java\maven-nblibetbeans-eventspy.jar\" -Dfile.encoding=UTF-8 org.codehaus.mojo:exec-maven-plugin:1.2.1:exec\" Running NetBeans 在保存执行时编译。跳过相位执行并输出 依赖项项目的目录(打开了"保存时编译"( 将代替他们的 JAR 工件使用。正在扫描项目...

------------------------------------------------------------------------ 构建溢出 1.0-快照

--- exec-maven-plugin:1.2.1:exec (default-cli( @ OverFlow --- Prueba Prueba java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901( at java.util.ArrayList$Itr.next(ArrayList.java:851( at com.generic.prueba.main(prueba.java:23( ------------------------------------------------------------------------建立成功 ------------------------------------------------------------------------ 总时间:0.748秒 完成时间:2020 年 2 月 2 日星期日 13:55:11 COT 2020 决赛

内存:6M/245M

最新更新