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