2016-09-25 145 views
-2

我在我的Java程序中收到有關我的數組列表的數組列表的異常。我在下面列出了我的程序的相關部分。IndexOutOfBoundsException:索引:3,大小:0

List<List<Integer>> inverse_men_preference = new ArrayList<List<Integer>>(n); 
    for (int i = 0; i < n; i++) 
    { 
     inverse_men_preference.add(new ArrayList<Integer>(n)); 
    } 

    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      inverse_men_preference.get(i).add(marriage.getMenPreference().get(i).get(j), j); 
     } 
    } 

我看着類似的問題,但我仍然不知道爲什麼我的數組列表的大小被認爲是空的。我是Java新手,所以我想我有一些根本的誤解,使我無法理解錯誤。任何意見或建議都會有所幫助。謝謝。

+3

可能重複[什麼導致java.lang.ArrayIndexOutOfBoundsException,我該如何防止它?](http://stackoverflow.com/questions/5554734/what-c​​auses-a-java-lang-arrayindexoutofboundsexception-and-我該怎麼辦 - 它) – vaxquis

回答

3

你已經把任何項目放在ArrayList中。 n只是它的容量,而不是它的大小。始終使用集合的size(),並避免使用magic numbers

+0

謝謝。爲什麼不會在數組列表中添加10個數組列表的第一個循環不使大小爲10?我希望我的問題有道理。 – Gopika

+0

@Gopika他顯然是在談論你已經添加到'inverse_men_preference'的ArrayList。他們是空的。 – Tom

+1

@Tom謝謝你的澄清!我想我自動認爲問題是與ArrayList inverse_men_preference。 – Gopika

0

看起來像你得到的錯誤是因爲marriage.getMenPreference().get(i).get(j)部分。可能由marriage.getMenPreference()返回的列表中的任何一個都沒有ithjth元素。如果我們更換與常數,它工作得很好,例如:

int n = 2; 
List<List<Integer>> inverse_men_preference = new ArrayList<List<Integer>>(n); 
for (int i = 0; i < n; i++) { 
    inverse_men_preference.add(new ArrayList<Integer>(n)); 
} 

for (int i = 0; i < n; i++) { 
    for (int j = 0; j < n; j++) { 
     inverse_men_preference.get(i).add(0, j); 
    } 
} 

確保已marriage.getMenPreference()初始化/填充上述被執行之前。

+0

感謝您的回覆!這不是問題,因爲它們被傳遞到已經填充的函數中。 – Gopika

0

這不是你的任何列表的問題。除了添加單個整數外,您可以指定一個例外 - 您可以使用兩個參數調用方法「add」。這工作好:

public static void main(String[] args) { 
    int n = 10; 
    List<List<Integer>> inverse_men_preference = new ArrayList<List<Integer>>(n); 

    for (int i = 0; i < n; i++) 
     inverse_men_preference.add(new ArrayList<Integer>(n)); 

    for (int i = 0; i < n; i++) 
     for (int j = 0; j < n; j++) 
      inverse_men_preference.get(i).add(5); 
} 

,而這是你要做的:

public static void main(String[] args) { 
    int n = 10; 
    List<List<Integer>> inverse_men_preference = new ArrayList<List<Integer>>(n); 

    for (int i = 0; i < n; i++) 
     inverse_men_preference.add(new ArrayList<Integer>(n)); 

    for (int i = 0; i < n; i++) 
     for (int j = 0; j < n; j++) 
      inverse_men_preference.get(i).add(5, 34); 
} 

名單是可以插入元素開始/中間/到它的結束這樣一個集合。雖然它是空的,但不能添加元素,例如在第五位。我建議使用數組而不是arraylist,因此您可以隨時在其不同位置插入值。

+0

感謝您的回答。有一個add方法需要兩個參數 - 索引和要添加到該索引的元素。那麼,爲什麼我的方法不能工作? – Gopika

+0

@Gopika我編輯了我的答案來解釋你的例外。 –

+0

謝謝您的回覆!我使用了像你推薦的陣列列表。這擺脫了我最初的錯誤,因爲我沒有空的數組列表問題。但是,它之後仍然會導致錯誤,因爲我得到空指針異常,因爲arraylist中的數組尚未初始化。這與我之前的問題基本相同。另外,我意識到我需要使用數組列表而不是數組,因爲我想在兩個對象映射到同一個索引時使用add方法的移位屬性。 – Gopika

相關問題