Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList错误:大小相同,包含;空";删除()后的元素,其中一些_Java_Android_Arraylist_Nullpointerexception - Fatal编程技术网

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复制的是错误删除的空引用?顺便说一句,我在迭代之前很久就删除了这些项,所以我认为这不是并发问题不抱歉,这是一个巨大的项目,但问题只是在删除一些项之后迭代一个简单数组,非常简单的删除在迭代之前很长一段时间被称为,在您的示例中,是以相同的方式调用的。您是否尝试在迭代之前克隆引用?