似乎无法绕过java.lang.ArrayIndexOutOfBoundsException:-1

时间:2013-02-15 10:29:22

标签: java indexoutofboundsexception

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

3 个答案:

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

此处您不会检查MouseListCatList尺寸是否大于0。

因此,如果MouseList.size()返回0,则 所以int slump = MouseList.size()-1; = int slump = -1;

现在当你MouseList.get(slump);时,这意味着你正在呼叫MouseList.get(-1);

所以它会引发异常。

首先检查列表的大小是否大于0(非空)。

答案 2 :(得分:0)

正如其他人所指出的,当您尝试slump时,问题是-1get(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()