2013-12-11 458 views
2

在下面的代碼中,我從一個數組列表中刪除項目,但在此之前,我檢查獲取索引,如果它存在(非空)然後我調用remove方法。但我得到一個java.lang.ArrayIndexOutOfBoundsException,即使我檢查爲空...我無法弄清楚爲什麼會發生這種情況。請幫幫我!!java.lang.ArrayIndexOutOfBoundsException ...不知道爲什麼

private List<MyObject>[] arraylist; 

// ... in the constructor the arraylist is initialized as follows: 
this.arraylist = new ArrayList[SIZE]; 
for(int i = 0; i < SIZE; i++){ 
    this.arraylist[i] = new ArrayList<MyObject>(); 
} 
// 

public Integer getIndex(int num){ 
    for(int i = 0; i < this.arraylist.length; i++){ 
     if(this.arraylist[i].size() > 0 && this.arraylist[i].get(0).getNum() == num){ 
      return i; 
     } 
    } 
    return null; 
} 

public void myRemoveMethod(int num){ 
    Integer index = this.getIndex(num); 
    if(index != null){ 
     MyObject myObject= this.arraylist[index].remove(0); // **getting java.lang.ArrayIndexOutOfBoundsException** 
     //... do some other stuff 
    } 
} 
+4

這是一些很混亂的代碼。我建議不是單步執行它,就是放入一些printlns;很有可能你沒有按照自己的想法去做,但是因爲你知道自己在做什麼,所以它應該很容易調試。我不。 –

+0

您是否嘗試過調試它,以確切地查看正在使用的值?也。 ArrayLists數組......真的嗎? – M21B8

+0

我建議花時間學習列表的工作方式。猜測讓你陷入麻煩。 – kviiri

回答

2

ArrayListremove方法看起來像:

public E remove(int index) { 
    rangeCheck(index); 

    modCount++; 
    E oldValue = elementData(index); 

    int numMoved = size - index - 1; 
    if (numMoved > 0) 
     System.arraycopy(elementData, index+1, elementData, index, 
         numMoved); 
    elementData[--size] = null; // Let gc do its work 

    return oldValue; 
} 

(至少在我源的版本)。 rangeCheck將拋出IndexOutOfBoundsException,而不是ArrayIndexOutOfBoundsException,如果index超出界限。但是,您的評論表明ArrayIndexOutOfBoundsException正在從此方法中拋出。我能看到這可能發生的地方是在方法使用此數組訪問:

elementData[--size] = null; // Let gc do its work 

這意味着elementData必須是介於縮短時remove開始,當它得到了這條線。所以我認爲這一定是一個併發問題,你需要使用某種同步機制。

+0

+1,因爲除此之外我沒有看到任何其他解釋,但根據OP,他只使用一個單獨的線程....所以它真的很奇怪......它不應該發生。 – Blub

+0

我只需要選擇這個作爲正確的答案,因爲它是最有意義的。也許我錯過了什麼。感謝大家! – matrix4use

相關問題