从arraylist中删除对象null

时间:2017-03-04 00:04:12

标签: java arrays arraylist nullpointerexception null

我有一个名为resolveClash的函数,我发送一个数组 (在本例中为combinsFinal),其中包含2个或更多类型的ModuleLecturerStudentCombination对象(这是我自己的类)。解决方案基本上是resolveClash函数的作用是将数组放入arraylist中,删除数组中的第一个元素/对象,然后返回列表。但是,当我在调试模式(eclipse)中检查返回值的状态时,它会显示在arraylist的末尾添加了一个空值。

我已经查找了#34;正确删除了对象"然而,到目前为止我所尝试的所有内容并没有摆脱null。执行删除后出现空值。我已经彻底检查过没有传入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;
}   

2 个答案:

答案 0 :(得分:2)

  

...当我在调试模式下检查返回值的状态时,它显示在arraylist的末尾添加了一个空值

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

但是如果你删除一些,它不会创建一个新的较短的数组,但只是在最后留下一些免费点,但只允许你访问应该是他们的第一个。在调试模式下,您还应该看到一个名为size的变量,它告诉您数组的哪一部分仍然是列表的一部分。

答案 1 :(得分:0)

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

  

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

     

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

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

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

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

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

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