2011-10-25 45 views
0
 do{ 

     System.out.println("inside do"); 
     for (int i = 0; i < i2; i++) { 

      String s2 = m_area.m_items.get(i).returnName(); 
      if (s2.contains(s)) { 

       itemexist_check = true; 
       player.addItem(m_area.m_items.get(i)); 
       m_area.m_items.remove(i); 
       } else { 

       //do nothing 
      } 
     } 
     itemexist_check = true; 
     }while(itemexist_check == false); 

當該做的語句運行,它會很樂意進行 「player.addItem(m_area.m_items.get(I))」,但是當它到達「m_area.m_items.remove(我)「(m_items是一個LinkedList),它會拋出一個」OutOfBoundsException:Index 1,Size 1「。通過打印LinkedList的大小以及打印「i」的值,我已經確定在「m_area.m_items.remove(i)」之前,LinkedList的大小是2,並且「我「是0.我明白爲什麼會拋出異常。 LinkedList中顯然沒有元素0。我不知道的是,爲什麼它沒有在「player.addItem(m_area.m_items.get(i))」上拋出異常呢?有些事情不對,請幫忙。的Java:奇怪OutOfBoundsException

謝謝

+0

哦。顯然LinkedList.get只在索引小於0時拋出異常,而LinkedList.remove在索引等於0時拋出異常。我想我真正的問題是,我該如何修復我的代碼? – Blackvein

+0

你的問題不清楚。例如。 'i2'指的是什麼? –

+0

不正確。 [LinkedList.get](http://download.oracle.com/javase/7/docs/api/java/util/LinkedList.html#get%28int%29)會拋出'IndexOutOfBoundsException' - 如果索引超出範圍'(index <0 || index> = size())' –

回答

1

處理列表遍歷+刪除的方法是將兩者分開。因此,使用標準的forearch循環遍歷列表(也比get調用更容易和更快)。將其添加到單獨的列表中,並在循環後使用m_area.m_items.removeAll(removedElementsList),而不是刪除該項目。

1

最好的辦法是使用foreach循環,而不是for 和刪除項目保存他們在其他組和循環

後使用removeall過的(TypeOfListItem項目:m_area.m_items){

  String s2 = item.returnName(); 
     if (s2.contains(s)) { 

      itemexist_check = true; 
      player.addItem(item); 
      itemsForDelete.add(item); 
      } else { 
      //do nothing 
     } 
    } 

m_area.m_items.removeAll(itemsForDelete);

2

I2是列表的大小?然後你在循環中停留一次迭代太多。你的延續條件應該是我i < i2-1。

並且不,remove()在索引爲0時不會引發異常,只有在它小於零時纔會引發異常。

至於使用for-each循環的建議,要小心。通常情況下,你不能修改循環中的列表 - 由於你正在修改m_area.m_items,所以看起來像這樣的限制將適用於此。