Java ArrayList错误:大小相同,包含;空";删除()后的元素,其中一些
我有一个对象的Java ArrayList错误:大小相同,包含;空";删除()后的元素,其中一些,java,android,arraylist,nullpointerexception,Java,Android,Arraylist,Nullpointerexception,我有一个对象的ArrayList,有时我调用remove()来删除其中的一些对象 我注意到Google Android开发者控制台中出现了一些关于NullPointerException的报告,最后我发现在某些情况下,我正在迭代该数组以访问对象,出于某种原因,在删除一些对象后,数组的大小仍然相同,例如,如果数组有11个元素,而我删除了最后一个元素,那么它仍然有11个元素,但最后一个元素包含null,因此,当.size()返回11时,在尝试访问最后一个位置中包含的null对象后,它会给出nullp
ArrayList
,有时我调用remove()
来删除其中的一些对象
我注意到Google Android开发者控制台中出现了一些关于NullPointerException
的报告,最后我发现在某些情况下,我正在迭代该数组以访问对象,出于某种原因,在删除一些对象后,数组的大小仍然相同,例如,如果数组有11个元素,而我删除了最后一个元素,那么它仍然有11个元素,但最后一个元素包含null,因此,当.size()
返回11时,在尝试访问最后一个位置中包含的null对象后,它会给出nullpointerexception
为什么会这样?如何避免这种情况
编辑:在迭代之前和删除之后,我将三个带有“addAll()”的数组合并为一个混合数组,可能addAll正在复制错误删除的空引用?您有错误,因为您正在迭代对象引用,当您删除一个对象时,引用等待实例相同。您可以使用hashmap,它允许同时迭代和删除对象 一个例子来得到我说的错误
/*
* 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();
}
}
}
/*
*要更改此许可证标题,请在“项目属性”中选择“许可证标题”。
*要更改此模板文件,请选择工具|模板
*然后在编辑器中打开模板。
*/
包com.generic;
导入java.util.ArrayList;
导入java.util.Scanner;
/**
*
*@作者威尔索
*/
公共级普鲁巴{
公共静态void main(字符串[]args){
试一试{
ArrayList dta=新的ArrayList();
dta.添加(“Prueba”);
dta.添加(“Prueba 2”);
dta.添加(“Prueba 3”);
用于(字符串tmp:dta){
系统输出打印LN(tmp);
系统输出打印LN(tmp);
dta.移除(1);
}
}捕获(例外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\u 91\bin\Java.exe\”
-Dexec.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:exec-maven插件:1.2.1:exec\“”运行NetBeans
在保存执行时编译。跳过阶段执行并输出
依赖项项目的目录(启用“保存时编译”)
将使用,而不是它们的jar工件。正在扫描项目
------------------------------------------------------------------------构建溢出1.0-SNAPSHOT
---exec maven插件:1.2.1:exec(默认cli)@OverFlow---Prueba Prueba java.util.ConcurrentModificationException位于
java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)位于
java.util.ArrayList$Itr.next(ArrayList.java:851)位于
com.generic.prueba.main(prueba.java:23)
------------------------------------------------------------------------建立成功
------------------------------------------------------------------------总时间:0.748秒完成时间:太阳2月2日13:55:11
内存:6M/245M
您正在尝试在多个线程中执行此操作吗<代码>数组列表不是线程安全的。从根本上说,我怀疑你误判了这个问题,但如果没有看到一个复制,很难判断。@JonSkeet在迭代之前,在删除之后,我将三个带有“addAll()”的数组合并成一个混合数组,可能addAll正在复制错误删除的空引用?@JonSkeet顺便说一句,我没有使用线程,我在迭代之前很久就删除了这些项,所以我认为这不是并发问题。与其描述代码,不如向我们展示您的代码——最好是以a的形式。在迭代之前,删除之后,我将使用“addAll()”将三个数组合并为一个混合数组,也许addAll复制的是错误删除的空引用?顺便说一句,我在迭代之前很久就删除了这些项,所以我认为这不是并发问题不抱歉,这是一个巨大的项目,但问题只是在删除一些项之后迭代一个简单数组,非常简单的删除在迭代之前很长一段时间被称为,在您的示例中,是以相同的方式调用的。您是否尝试在迭代之前克隆引用?