2013-02-15 2 views
2

Я довольно новое в Java, и я не могу обойти сообщение об ошибкеНе могу обойти java.lang.ArrayIndexOutOfBoundsException: -1

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

Не похоже, чтобы вы проверяли размер MouseList где-либо перед тем, как позвонить ему. – Derek

+0

Вы пробовали отладку в дополнение к простому проверке кода? – Brian

+0

Какова ценность 'MouseList.size()'? –

ответ

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

+0

Спасибо! Никогда не считал это сам, но когда вы это говорите, это очевидно. Большое спасибо! – Erik

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 (это не пусто).

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().
  • Но «сила» не является концепцией «да/нет» на английском языке. Это то, что вы количественно оцениваете.
  • Но если «сила» действительно является логической, то в соглашении JavaBeans говорится, что метод следует называть isStrength() не getStrength().
+0

Спасибо. Теперь я понимаю, что это действительно лучшая идея, чтобы избавиться от внутреннего цикла, я это сделаю. Что касается имен переменных, я обязательно буду это учитывать. Еще раз спасибо! – Erik

Смежные вопросы