2011-10-25 43 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,所以看起来像这样的限制将适用于此。