Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList ArrayIndexOutOfBoundsException_Java_Loops_For Loop_Arraylist - Fatal编程技术网

Java ArrayList ArrayIndexOutOfBoundsException

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;

我正在做一个口袋妖怪式的配对计算器(水击火等),我遇到了一个相当奇怪的错误。我正在遍历一个包含口袋妖怪所有弱点的ArrayList,并将其与所有阻力进行比较,以查看是否有任何阻力被抵消。它在GitHub上的存储库。在src/main/Pokemon.java的第140行抛出异常。我已经解释了当一个项目被删除时索引的变化,但仍然没有运气。下面是令人不快的循环:

//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也只会保持在0
e
的增量。例如,
e--
将在第二个循环的每次迭代期间执行,使
e
为负值
r
在第二个for循环开始时递增,然后在结束时再次变为0。这将创建一个无限循环