【问题标题】:removing object from arraylist leaves null从 arraylist 中删除对象会留下 null
【发布时间】:2017-03-04 00:04:12
【问题描述】:

我有一个名为 resolveClash 的函数,我发送一个数组 (在这种情况下-combinsFinal),其中包含 2 个或多个 ModuleLecturerStudentCombination 类型的对象(这是我自己的类)。本质上,resolveClash 函数所做的是将数组放入数组列表中,删除数组中的第一个元素/对象,然后返回列表。但是,当我在调试模式 (eclipse) 中检查返回值的状态时,它显示空值已添加到数组列表的末尾。

我已经查找了“正确删除对象”等,但是,到目前为止我尝试过的所有内容都没有摆脱空值。执行删除后出现空值。我已经彻底检查过没有传入 null 等。这是一个问题,因为当我使用它并稍后迭代它时,它会选择一个 null 并给我一个 nullpointerexception 错误。有人可以让我知道我做错了什么或指出我正确的方向吗?

提前致谢!

picture displaying problem

resolveClash(combinsFinal);


public ArrayList <ModuleLecturerStudentCombination> resolveClash(ModuleLecturerStudentCombination[] combinationArr){
    ArrayList<ModuleLecturerStudentCombination> copyCombinationList = new ArrayList<ModuleLecturerStudentCombination>(Arrays.asList(combinationArr));
    copyCombinationList.remove(0);
    return copyCombinationList;
}   

【问题讨论】:

  • 您是否使用 eclipse 或类似工具并在 Debug 透视图中查看结果?
  • return new ArrayList&lt;&gt;(Arrays.asList(combinationArr).subList(1, combinationArr.length())); 会更容易。
  • 您如何知道返回的ArrayList 包含null?你怎么知道 null 不在你传递给方法的数组中?在调试模式下,您将看到 ArrayList 的实现细节,包括后备数组中不属于列表值的条目。
  • 我已经更新了帖子来回答这些问题
  • @michaelskellig510 你应该在问题中添加附加代码而不是使用图片(特别是因为问题似乎在附加代码中)

标签: java arrays arraylist nullpointerexception null


【解决方案1】:

...当我在调试模式下检查返回值的状态时,它显示一个空值已添加到数组列表的末尾

这是它的正常工作方式。 ArrayList 中的数据存储在一个数组中,然后将其包装在类中以按照列表的方式运行。如果添加元素并且数组很小,它将创建一个更大的数组并复制对象。

但是,如果您删除一些,它不会创建一个新的更短的数组,而只是在最后留下一些空闲位置,但只能让您访问应该是他们的第一个。在调试模式下,您还应该看到一个名为 size 的变量,它告诉您数组的哪一部分仍然是列表的一部分。

【讨论】:

    【解决方案2】:

    在您的情况下,ArrayList 方法 toArray(T []) 没有返回新数组。来自文档:

    [...] 如果列表适合指定的数组,则在其中返回。 否则,将分配一个具有运行时类型的新数组 指定的数组和此列表的大小。

    如果列表适合 有空间的指定数组(即,数组有更多元素 比列表),数组中紧跟在末尾之后的元素 集合的设置为空。 [...]

    数组combinsFinal 的大小比列表大,因此结果会直接返回到列表中,并带有额外的null。在这种情况下,不会创建具有正确大小的新数组。

    为了避免这种情况,由于您无法更改数组的大小,您可以创建一个与列表大小相同的新数组,这样就可以正常工作:

    combinsFinal = new ModuleLecturerStudentCombination[temp.size()];
    temp.toArray(combinsFinal);
    

    或者只是传递一个没有大小的数组,因此该方法将被强制创建并返回一个具有正确大小的新数组:

    combinsFinal = temp.toArray(new ModuleLecturerStudentCombination[0]);
    

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2013-04-17
      • 1970-01-01
      相关资源
      最近更新 更多