【问题标题】:ArrayList ERROR: same size, containing "null" elements after remove() some of themArrayList 错误:大小相同,在 remove() 之后包含“空”元素
【发布时间】:2020-05-18 15:06:29
【问题描述】:

我有一个ArrayList 的对象,有时我打电话给remove() 删除其中的一些。

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

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

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

【问题讨论】:

  • 您是否尝试在多个线程中执行此操作? ArrayList 不是线程安全的。从根本上说,我怀疑您误诊了问题,但如果没有看到重现,很难判断。
  • @JonSkeet 在迭代之前和删除之后,我将三个带有“addAll()”的数组合并为一个混合数组,也许 addAll 正在复制错误删除的空引用?
  • @JonSkeet btw 我没有使用线程,并且在迭代它们之前很久就删除了这些项目,所以我认为这不是并发问题
  • 与其描述你的代码,你应该向我们展示你的代码——最好是minimal reproducible example的形式。

标签: java android arraylist nullpointerexception


【解决方案1】:

你有错误,由于你正在迭代一个对象引用,当你删除一个对象时,引用等待实例是相同的。你可以使用 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();
        }
    }

}

它产生下一个错误

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-nblib\netbeans-eventspy.jar\" -Dfile.encoding=UTF-8 org.codehaus.mojo:exec-maven-plugin:1.2.1:exec\"" 运行 NetBeans 保存执行时编译。跳过阶段执行并输出 依赖项目的目录(打开保存时编译) 将被用来代替他们的 jar 工件。正在扫描项目...

----------------------------------------------- ------------------------- 构建 OverFlow 1.0-SNAPSHOT

--- exec-maven-plugin:1.2.1:exec (default-cli) @ OverFlow --- Prueba Prueba java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) 在 java.util.ArrayList$Itr.next(ArrayList.java:851) 在 com.generic.prueba.main(prueba.java:23) -------------------------------------------------- ---------------------- 建立成功 -------------------------------------------------- ---------------------- 总时间:0.748s 完成时间:Sun Feb 02 13:55:11 COT 2020 Final

内存:6M/245M

【讨论】:

  • 在迭代之前和删除之后,我将三个带有“addAll()”的数组合并为一个混合数组,也许 addAll 正在复制错误删除的空引用?
  • 顺便说一句,我在迭代它们之前很久就删除了这些项目,所以我认为这不是并发问题
  • 不抱歉,这是一个巨大的项目,但问题只是删除一些项目后迭代一个简单的数组,非常简单
  • remove 在迭代之前被调用了很长时间,在你的示例中被调用了
  • 您是否尝试在迭代之前克隆引用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多