2

我是 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;
            } 
        } 
    } 
}
4

3 回答 3

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

于 2013-02-15T10:32:55.447 回答
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(即不为空)。

于 2013-02-15T10:33:51.250 回答
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()
  • 但是“力量”在英语中不是一个是/否的概念。这是你量化的东西。
  • 但是如果“strength”真的是一个布尔值,那么 JavaBeans 约定说该方法不应该被isStrength()调用getStrength()
于 2013-02-15T10:44:46.240 回答