Java:奇怪的OutOfBoundsException

时间:2011-10-25 06:59:33

标签: java linked-list do-while

        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: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))”上抛出异常?有些东西不在这里,请帮助。

谢谢

3 个答案:

答案 0 :(得分:2)

I2是列表的大小吗?那么你在循环中停留的次数太多了。你是继续条件应该是我&lt; I2-1。

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

至于使用for-each循环的建议,请小心。通常,您无法修改循环中的列表 - 由于您正在修改m_area.m_items,因此此处的限制将适用。

答案 1 :(得分:1)

最好的方法是使用foreach循环代替for 并删除项目保存在其他集合中并在循环后使用RemoveAll

for(TypeOfListItem item: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 :(得分:1)

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

之后