我得到一个java.lang.IndexOutofBoundsSeption:无效的索引9,大小为5
当我将一个项目从一个数组列表中移除并放置到另一个数组列表中时,我会不断得到这个例外。 有时索引是13,大小是5。其他时间为0和0。这是随机发生的,在速度较慢的设备上更为常见我得到一个java.lang.IndexOutofBoundsSeption:无效的索引9,大小为5,java,android,Java,Android,当我将一个项目从一个数组列表中移除并放置到另一个数组列表中时,我会不断得到这个例外。 有时索引是13,大小是5。其他时间为0和0。这是随机发生的,在速度较慢的设备上更为常见 11-05 19:42:34.487: W/dalvikvm(2232): threadid=14: thread exiting with uncaught exception (group=0x40c3ca68) 11-05 19:42:34.497: E/AndroidRuntime(2232): FATAL EX
11-05 19:42:34.487: W/dalvikvm(2232): threadid=14: thread exiting with uncaught exception (group=0x40c3ca68)
11-05 19:42:34.497: E/AndroidRuntime(2232): FATAL EXCEPTION: Thread-491
11-05 19:42:34.497: E/AndroidRuntime(2232): java.lang.IndexOutOfBoundsException: Invalid index size is 5
11-05 19:42:34.497: E/AndroidRuntime(2232): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
11-05 19:42:34.497: E/AndroidRuntime(2232): at java.util.ArrayList.add(ArrayList.java:143)
11-05 19:42:34.497: E/AndroidRuntime(2232): at com.pigeoncraft.pigeoncraft.entity.Inventory.add(Inventory.java:25)
11-05 19:42:34.497: E/AndroidRuntime(2232): at com.pigeoncraft.pigeoncraft.screen.ContainerMenu.tick(ContainerMenu.java:62)
11-05 19:42:34.497: E/AndroidRuntime(2232): at com.pigeoncraft.pigeoncraft.Game.tick(Game.java:312)
11-05 19:42:34.497: E/AndroidRuntime(2232): at com.pigeoncraft.pigeoncraft.Game.iterate(Game.java:265)
11-05 19:42:34.497: E/AndroidRuntime(2232): at com.pigeoncraft.pigeoncraft.GameActivity$2.run(GameActivity.java:128)
11-05 19:42:34.497: E/AndroidRuntime(2232): at java.lang.Thread.run(Thread.java:856)
这是库存代码
package com.mojang.ld22.entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.pigeoncraft.pigeoncraft.item.Item;
import com.pigeoncraft.pigeoncraft.ResourceItem;
import com.pigeoncraft.pigeoncraft.Resource;
public class Inventory implements Serializable {
private static final long serialVersionUID = -8246630353617240883L;
public List<Item> items = new ArrayList<Item>();
public void add(Item item) {
add(items.size(), item);
}
public void add(int slot, Item item) {
if (item instanceof ResourceItem) {
ResourceItem toTake = (ResourceItem) item;
ResourceItem has = findResource(toTake.resource);
if (has == null) {
items.add(slot, toTake); <--------------------
} else {
has.count += toTake.count;
}
} else {
items.add(slot, item);
}
}
private ResourceItem findResource(Resource resource) {
for (int i = 0; i < items.size(); i++) {
if (items.get(i) instanceof ResourceItem) {
ResourceItem has = (ResourceItem) items.get(i);
if (has.resource.name.equals(resource.name))
{
return has;
}
}
}
return null;
}
public boolean hasResources(Resource r, int count) {
ResourceItem ri = findResource(r);
if (ri == null) return false;
return ri.count >= count;
}
public boolean removeResource(Resource r, int count) {
ResourceItem ri = findResource(r);
if (ri == null) return false;
if (ri.count < count) return false;
ri.count -= count;
if (ri.count <= 0) items.remove(ri);
return true;
}
public int count(Item item) {
if (item instanceof ResourceItem) {
ResourceItem ri = findResource(((ResourceItem)item).resource);
if (ri!=null) return ri.count;
} else {
int count = 0;
for (int i=0; i<items.size(); i++) {
if (items.get(i).matches(item)) count++;
}
return count;
}
return 0;
}
}
如果不知道代码在ArrayList中添加/删除对象时的具体操作,很明显,该代码根本不是线程安全的,因为没有同步任何方法/变量。ArrayList本身是免费的,因为Java免费提供给您,但是您的add方法甚至从不检查您是否试图在可支持的索引处插入对象。在调用add之前,您至少应该检查slot>=items.length,这样您就可以将它附加到列表的末尾,或者更优雅地退出,至少要检查错误所显示的内容;从tick方法中,您正在调用add9,…,而数组中只有5个元素。我不明白为什么您使用addindex,element而不是addelement。你能解释一下吗?看起来你总是在ArrayList的末尾添加。addE就足够了,因为这就是它的工作方式。如果你有很好的理由在特定位置添加项目,而不仅仅是在末尾,在ArrayList足够大之前,您需要通过添加例如null来达到高索引。@PatriciaShanahan在这一点上,我建议您使用Map。您能澄清一下吗,因为Java免费提供给您?ArrayList不是线程安全的。