Java ArrayList ArrayIndexOutOfBoundsException
我正在做一个口袋妖怪式的配对计算器(水击火等),我遇到了一个相当奇怪的错误。我正在遍历一个包含口袋妖怪所有弱点的ArrayList,并将其与所有阻力进行比较,以查看是否有任何阻力被抵消。它在GitHub上的存储库。在src/main/Pokemon.java的第140行抛出异常。我已经解释了当一个项目被删除时索引的变化,但仍然没有运气。下面是令人不快的循环:Java ArrayList ArrayIndexOutOfBoundsException,java,loops,for-loop,arraylist,Java,Loops,For Loop,Arraylist,我正在做一个口袋妖怪式的配对计算器(水击火等),我遇到了一个相当奇怪的错误。我正在遍历一个包含口袋妖怪所有弱点的ArrayList,并将其与所有阻力进行比较,以查看是否有任何阻力被抵消。它在GitHub上的存储库。在src/main/Pokemon.java的第140行抛出异常。我已经解释了当一个项目被删除时索引的变化,但仍然没有运气。下面是令人不快的循环: //Check 2x weakness v 2x Resist eDiff = 0; rDiff = 0; for (int e = 0;
//Check 2x weakness v 2x Resist
eDiff = 0;
rDiff = 0;
for (int e = 0; e < effective.size()-eDiff; e++) {
for (int r = 0; r < resist.size()-rDiff; r++) {
if (effective.get(e-eDiff).equals(resist.get(r-rDiff))) {
effective.remove(e-eDiff);
resist.remove(r-rDiff);
eDiff++;
rDiff++;
}
}
}
//检查2x弱点vs 2x抵抗
eDiff=0;
rDiff=0;
对于(int e=0;e
有什么想法吗?例如,当
rDiff
变为1时,您可以看到r-rDiff
可能是负数,get
导致错误
您应该在循环中使用eDiff
和rDiff
修改该循环
我认为类似的方法应该奏效:
for (int e = 0; e < effective.size(); e++) {
for (int r = 0; r < resist.size(); r++) {
if (effective.get(e).equals(resist.get(r))) {
effective.remove(e);
resist.remove(r);
e--;
break;
}
}
}
for(int e=0;e
例如,当rDiff
变为1时,您可以看到r-rDiff
可以为负值,并且get
会导致错误
您应该在循环中使用eDiff
和rDiff
修改该循环
我认为类似的方法应该奏效:
for (int e = 0; e < effective.size(); e++) {
for (int r = 0; r < resist.size(); r++) {
if (effective.get(e).equals(resist.get(r))) {
effective.remove(e);
resist.remove(r);
e--;
break;
}
}
}
for(int e=0;e
您的问题在第二个for循环中,每次运行时您都会增加ediff
,而e
在第二个for循环完成之前不会增加。这将为您提供
0-ediff=-x
负整数不是数组的有效索引
如果两个数组的大小相同,请尝试此操作
for (int i = 0; resist.size(); i++){// I increments by one each time
if (effect.get(i) == resist.get(i)){//gets the value at index 1 through I, and compares them
effective.remove(i);//removes them if they are equal
resist.remove(i);
}
}
您的问题在第二个for循环中,每次运行时您都会增加
ediff
,而e
在第二个for循环完成之前不会增加。这将为您提供
0-ediff=-x
负整数不是数组的有效索引
如果两个数组的大小相同,请尝试此操作
for (int i = 0; resist.size(); i++){// I increments by one each time
if (effect.get(i) == resist.get(i)){//gets the value at index 1 through I, and compares them
effective.remove(i);//removes them if they are equal
resist.remove(i);
}
}
那根本行不通。它仍然会抛出异常,因为e将小于1。当第一个for循环运行时,r也只会保持在0
e
的增量。例如,e--
将在第二个循环的每次迭代期间执行,使e
为负值r
在第二个for循环开始时递增,然后在结束时再次变为0。这将创建一个根本不起作用的无限循环。它仍然会抛出异常,因为e将小于1。当第一个for循环运行时,r也只会保持在0e
的增量。例如,e--
将在第二个循环的每次迭代期间执行,使e
为负值r
在第二个for循环开始时递增,然后在结束时再次变为0。这将创建一个无限循环