我是Java的新手,我似乎无法绕过错误消息
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:371)
at java.util.ArrayList.get(ArrayList.java:384)
at djurfarm.Animals.huntCatMouse(Animals.java:213)
at djurfarm.Djurfarm.main(Djurfarm.java:24)
Java Result: 1
我知道这意味着什么,索引在某处低于或高于它应该是什么,但我不能为我的生活找出为什么会发生这种情况。也许是因为我盯着自己失明,不会看到逻辑失败的地方。任何帮助将不胜感激。以下是该方法的代码:
public void huntCatMouse() {
while (!CatList.isEmpty()) {
for (int i = 0 ; i < CatList.size(); i++) {
try {
TimeUnit.MILLISECONDS.sleep(500);
int slump = MouseList.size() - 1;
int num = CatList.size() - 1;
Cat CatRemover = CatList.get(num);
Mouse aMouse = MouseList.get(slump);
if (aMouse.getStrength().equals(false)) {
System.out.println("En katt fångar en mus.");
CatList.remove(CatRemover);
MouseList.remove(aMouse);
} else if (aMouse.getStrength().equals(true)) {
System.out.println("En mus lyckas fly från en katt.");
CatList.remove(CatRemover);
MouseList.remove(aMouse);
}
} catch (InterruptedException e) {
System.out.println("Fel i CatMouse");
}
if (MouseList.isEmpty()) {
System.out.println("Empty list");
break;
}
}
}
}
答案 0 :(得分:3)
int slump = MouseList.size()-1;
似乎MouseList
是一个空列表,size
方法返回0,slump
变为-1和
MouseList.remove(aMouse); // MouseList.remove(-1)
导致ArrayIndexOutOfBoundsException
为-1索引。
您已将条件!CatList.isEmpty()
置于!CatList.isEmpty() && !MouseList.isEmpty()
答案 1 :(得分:0)
错误可能是因为:
int slump = MouseList.size()-1;
int num = CatList.size()-1;
Cat CatRemover = CatList.get(num);
Mouse aMouse = MouseList.get(slump);
此处您不会检查MouseList
或CatList
尺寸是否大于0。
因此,如果MouseList.size()
返回0,则
所以int slump = MouseList.size()-1;
= int slump = -1;
现在当你MouseList.get(slump);
时,这意味着你正在呼叫MouseList.get(-1);
所以它会引发异常。
首先检查列表的大小是否大于0(非空)。
答案 2 :(得分:0)
正如其他人所指出的,当您尝试slump
时,问题是-1
为get(slump)
。
它进入该状态的原因是当鼠标列表变空时你没有停止。特别是,最后的if (...) { break; }
只会突破内部循环。所以你尝试外循环的条件,再次启动内循环... OOOPs!
显而易见的解决方法是在外循环条件下测试两个列表大小。
但更好的解决方法是完全摆脱内循环。只需一个循环级别就可以更简单地实现它。
while (!CatList.isEmpty() && !MouseList.isEmpty()) {
try {
TimeUnit.MILLISECONDS.sleep(500);
int slump = MouseList.size() - 1;
int num = CatList.size() - 1;
Cat CatRemover = CatList.get(num);
Mouse aMouse = MouseList.get(slump);
if (aMouse.getStrength().equals(false)) {
System.out.println("En katt fångar en mus.");
CatList.remove(CatRemover);
MouseList.remove(aMouse);
} else if (aMouse.getStrength().equals(true)) {
System.out.println("En mus lyckas fly från en katt.");
CatList.remove(CatRemover);
MouseList.remove(aMouse);
}
} catch (InterruptedException e) {
System.out.println("Fel i CatMouse");
}
}
虽然我引起了您的注意,但您需要修复本地变量的名称。根据Java样式指南,Java变量名应始终以小写字母开头...并试着让缩进正确。它使您的代码更容易阅读。
最后,这真是奇特:aMouse.getStrength().equals(true)
。
getStrength()
会返回boolean
。aMouse.getStrength()
。isStrength()
而不是getStrength()
。