Java: Strange OutOfBoundsException


        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,"i"的值是0。我理解它为什么抛出异常。很明显,LinkedList中没有元素0。我不知道的是,为什么它没有抛出"player.addItem(m_area.m_items.get(I))"的异常?这里有点不对劲,请帮忙。

谢谢

I2是列表的大小吗?那么你在循环中停留的次数就多了一次。你的延续条件应该是i <i2-1。>

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

对于使用for-each循环的建议,要小心。通常情况下,你不能在循环中修改列表——这个限制看起来会在这里适用,因为你正在修改m_area.m_items.

处理列表遍历+删除的最节省的方法是将两者分开。因此,使用标准forearch循环遍历列表(也比get调用简单和快速得多)。而不是删除项目,将其添加到一个单独的列表中,并在循环后使用m_area.m_items.removeAll(removedElementsList)

最好的方法是用foreach循环代替for对于删除项,将它们保存在其他集合中,并在loop

后使用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);

相关内容

  • 没有找到相关文章

最新更新