我有一个名为resolveClash的函数,我发送一个数组 (在本例中为combinsFinal),其中包含2个或更多类型的ModuleLecturerStudentCombination对象(这是我自己的类)。解决方案基本上是resolveClash函数的作用是将数组放入arraylist中,删除数组中的第一个元素/对象,然后返回列表。但是,当我在调试模式(eclipse)中检查返回值的状态时,它会显示在arraylist的末尾添加了一个空值。
我已经查找了#34;正确删除了对象"然而,到目前为止我所尝试的所有内容并没有摆脱null。执行删除后出现空值。我已经彻底检查过没有传入null等。这是一个问题,因为当我使用它并稍后迭代它时,它会获取一个null并给我一个nullpointerexception错误。有人可以让我知道我做错了什么或者指出了我正确的方向吗?
提前致谢!
resolveClash(combinsFinal);
public ArrayList <ModuleLecturerStudentCombination> resolveClash(ModuleLecturerStudentCombination[] combinationArr){
ArrayList<ModuleLecturerStudentCombination> copyCombinationList = new ArrayList<ModuleLecturerStudentCombination>(Arrays.asList(combinationArr));
copyCombinationList.remove(0);
return copyCombinationList;
}
答案 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]);