2015-10-29 7 views
0

Я изучаю язык Java, и я пытаюсь сделать игру MasterMind. я получаю следующее сообщение об ошибке при попытке компиляции, и при попытке отладки кода, я не могу найти ошибку:IndexOutOfBounds, когда он не должен

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 97, Size: 4 
    at java.util.ArrayList.rangeCheck(ArrayList.java:635) 
    at java.util.ArrayList.remove(ArrayList.java:474) 
    at mastermind.Combinacion.aciertos(Combinacion.java:115) 
    at mastermind.Combinacion.principal(Combinacion.java:36) 
    at mastermind.MasterMind.main(MasterMind.java:21) 
Java Result: 1 

Следующий код является метод «aciertos», что данный секретный ключ, и сочетание, говорит вам, сколько ваших писем находится в секретном ключе.

public int aciertos(Combinacion comb){ 
    int aciert = 0; 
    List<Character> clave = new ArrayList(); 
    // Transform the key to a List, so we can easily check what contains and remove elements 
    for(char c : this.codigo){ 
     clave.add(c); 
    } 
    // We go though the user try, and we check if the letter it is in the secret key list. If it is, we remove it from the list, to avoid counting twice if the user has a letter repeated and it is only once in the secret key. 
    for (int i = 0; i < comb.codigo.length; i++) { 
     if(clave.contains(comb.codigo[i])){ 
      aciert++; 
      clave.remove(comb.codigo[i]); 
     } 
    } 
    return aciert; 
} 

Этих поля из класса Combinacion:

//Size of each combination 
private int tamano = 4; 
//Los valores válidos son: blanco, negro, azul, rojo, verde, marron 
private static Character[] valoresValidos = {'b', 'n', 'a', 'r', 'v', 'm'}; 
private static List<Character> valores = Arrays.asList(valoresValidos); 
private char[] codigo = new char[tamano]; 

P.D: Я должен начать писать и комментирует все на английском языке, извините за испанские слова.

+2

Что такое строка 115 'Combinacion.java' –

+0

Каков тип' codigo'? 'Символ []'? – rgettman

+1

У вас есть два поля, называемых 'tamano' в классе' Combinacion'? – RealSkeptic

ответ

2

Я считаю, что char аргумент clave.remove(com.codigo[i]) продвигается к int вместо того, чтобы в коробке до Character. В результате вы вызываете ArrayList#remove(int index), а не метод, который вы хотите (ArrayList#remove(Object o)).

Попробуйте вручную боксе char так:

for (int i = 0; i < comb.codigo.length; i++) { 
    if(clave.contains(comb.codigo[i])){ 
     aciert++; 
     clave.remove(Character.valueOf(comb.codigo[i])); 
    } 
} 
+0

Я не понял, почему индекс был 97 !. Фактически, это значение char ('a' в этом случае). Это решило, спасибо. – Raul

6

Ошибка говорит на первой строке, что вы пытаетесь прочитать индекс 97 в ArrayList, который имеет всего 4 элемента. ArrayList.remove() использует индекс в качестве параметра, а не объект для удаления:

clave.remove(comb.codigo[i]) 

должен быть заменен:

clave.remove(clave.indexOf(comb.codigo[i])) 
+0

Но, не удалил бы элемент списка в том же положении, что и массив? Я хочу удалить из списка первый элемент в позиции i в массиве. – Raul

+0

Это то, что делает мой код. indexOf возвращает индекс первого вхождения указанного элемента в этот список или -1, если этот список не содержит этот элемент. – alcfeoh

+0

Вы правы, я не получил его с первого взгляда. Оба ответа хороши, я принял другое, что мне было легче понять, но я тоже хотел бы принять ваше. – Raul

0

Казалось бы, что линия clave.remove() использует содержимое comb.codigo [я] в качестве индекса. Значение, используемое в этом случае, равно 97, что соответствует нижнему регистру «a». Это то, что содержит массив?

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