2017-03-04 118 views
0

我有一個函數叫resolveClash,我發送一個數組 (在這種情況下 - combinsFinal)與其中的ModuleLecturerStudentCombination(這是我自己的類)的2個或更多的對象。基本上,resolveClash函數所做的是將數組放入數組列表中,刪除數組中的第一個元素/對象,然後返回列表。但是,當我在調試模式(eclipse)中檢查返回值的狀態時,它顯示null列表已添加到數組列表的末尾。從arraylist葉刪除對象null

我已經查找「正確移除對象」等,但是,迄今爲止我嘗試過的所有東西都沒有擺脫null。我執行刪除後出現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; 
} 
+0

您是否正在使用eclipse或類似工具並查看Debug透視圖中的結果? –

+1

'返回新的ArrayList <>(Arrays.asList(combinationArr).subList(1,combinationArr.length()));'會更容易。 –

+1

你如何知道***返回的'ArrayList'包含'null'?你怎麼知道null傳遞給該方法的數組中還沒有?在調試模式下,您將看到'ArrayList'的實現細節,包括支持數組中不屬於列表值的條目。 –

回答

2

...當我檢查調試模式下的返回值的狀態,它表明一個空值已添加到數組列表的末尾

這是它正常工作的方式。 ArrayList中的數據存儲在一個數組中,然後該數組被封裝在類中以表現行爲。如果添加元素並且數組很小,則會創建一個更大的元素並複製這些對象。

但是,如果你刪除了一些,它不會產生一個新的短陣,只是在最後留下一些免費的景點,但只給你訪問首當其衝應該是他們的。在調試模式下,您還應該看到一個名爲size的變量,它告訴您該數組的哪一部分仍然是列表的一部分。

0

在你的情況下,ArrayList方法toArray(T [])沒有返回一個新的數組。從文檔:

[...] [...]如果列表適合在指定的數組中,它將返回其中。 否則,將使用指定數組的運行時類型和此列表的大小分配一個新數組。

如果列表剩餘空間(即,所述陣列具有多個元件 比列表)的 指定數組中配合,所述陣列中的元件立即結束時收集的 設置爲空以下。 [...]

陣列combinsFinal具有這樣的結果與附加的null直接進入它返回比所述列表較大尺寸。在這種情況下,不會創建大小正確的新陣列。

爲了避免這種情況,因爲你不能改變數組的大小,你可以創建一個新的與列表的大小相同,那麼這將正常工作:

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

或替代地只是通過一個陣列沒有大小,所以該方法將被迫創建並返回具有正確大小的新陣列:

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