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);

当这个 do 语句运行时,它会愉快地执行“player.addItem(m_area.m_items.get(i))”,但是当它到达“m_area.m_items.remove(i)”(m_items 是一个 LinkedList)时,它抛出“OutOfBoundsException:索引 1,大小 1”。通过打印LinkedList的大小,以及打印“i”的值,我确定在“m_area.m_items.remove(i)”之前,LinkedList的大小是2,而“ i" 为 0。我明白它为什么会抛出异常。LinkedList 中显然没有 Element 0。我不知道的是,为什么它没有在“player.addItem(m_area.m_items.get(i))”上抛出异常?这里有问题,请帮忙。

谢谢

4

3 回答 3

2

I2 是列表的大小吗?然后你在循环中停留了太多次迭代。你的延续条件应该是 i < i2-1。

不,remove() 在 index 为 0 时不会抛出异常,仅当它小于零时。

As for the advice to use a for-each loop, be careful. Normally you can't modify the list within the loop -- a restriction that looks like would apply here since you are modifying m_area.m_items.

于 2011-10-25T07:12:48.573 回答
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);

于 2011-10-25T07:09:46.077 回答
1

处理列表遍历+删除最省钱的方法是将两者分开。因此,使用标准的 forarch 循环遍历您的列表(也比get调用更容易和更快)。不要删除该项目,而是将其添加到单独的列表中,然后在循环使用m_area.m_items.removeAll(removedElementsList).

于 2011-10-25T07:10:35.923 回答