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

ここでは、サイズが 0 より大きいかどうかをチェックしていませんMouseListCatList

したがって、 0 をMouseList.size()返す場合は=
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!

明らかな修正は、外側のループの条件で両方のリスト サイズをテストすることです。

しかし、より良い修正は、内側のループを完全に取り除くことです。これは、1 レベルのループだけで、より簡単に実装できます。

    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()しかし、"strength" が実際にブール値である場合、JavaBeans 規則では、メソッドはnotで呼び出されるべきであると規定されていgetStrength()ます。
于 2013-02-15T10:44:46.240 に答える