我正在学习Java语言,我正在尝试制作MasterMind游戏。 我在尝试编译时遇到以下错误,在尝试调试代码后,我找不到错误:
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:我应该开始用英语写作和评论所有内容,抱歉西班牙语。
答案 0 :(得分:6)
错误在第一行显示您正在尝试读取仅包含4个元素的ArrayList中的索引97。 ArrayList.remove()
使用索引作为参数,而不是要删除的对象:
clave.remove(comb.codigo[i])
必须替换为:
clave.remove(clave.indexOf(comb.codigo[i]))
答案 1 :(得分:2)
我认为char
的{{1}}参数正在提升为clave.remove(com.codigo[i])
,而不是被int
装箱。这最终会调用Character
而不是您想要的方法(ArrayList#remove(int index)
)。
尝试手动装箱ArrayList#remove(Object o)
,如下所示:
char
答案 2 :(得分:0)
看来clave.remove()行正在使用comb.codigo [i]的内容作为索引。在这种情况下使用的值是97,它对应于小写的“a”。这是数组包含的内容吗?