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