2016-05-05 10 views
0

私はポケモン型のマッチアップ電卓を作っています(ウォータービートなど)、私はかなり奇妙なバグに遭遇しました。私はそのポケモンのすべての弱点を含むArrayListを繰り返し、それらのどれかが打ち消されているかどうかを見るためにそれらをすべての抵抗と比較しています。 Here's GitHub上のリポジトリ。例外はsrc/main/Pokemon.javaの140行目にスローされています。アイテムが削除されたときにインデックスが変更されたが、まだ運がないことを説明しました。問題のループは次のとおりです。Java ArrayList ArrayIndexOutOfBoundsException

//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++; 
     } 
    } 
} 

+2

http://stackoverflow.com/questions/5554734/what-c​​auses-a-java-lang-arrayindexoutofboundsexception-and-how-do-i-prevent-it – Tunaki

答えて

2

たとえば、rDiffが1になると、r-rDiffが負になり、getがエラーを引き起こすことがわかります。

eDiffrDiffを使用してそのサイクルを変更する必要があります。

私は似た何かが動作するはずだと思う:

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; 
     } 
    } 
} 
+0

。 eは1未満になるので、それでも例外がスローされます。また、最初のforループが実行されたときだけ、eは0だけインクリメントされます。 – sbowde4

+0

そこでは、 'e - 'は2番目のループの各繰り返しの間に実行され、 'e'を負にします。 'r'は2番目のforループの始めでインクリメントし、最後に再び0になります。これは無限のループを作成します – sbowde4

+1

はい、私はそれを修正しました –

1

あなたの問題は、ループのための第二は、これはあなたに

を与え終えたまで eはしませんので注意しながら、あなたはすべての実行時に ediffをインクリメントされ、ループのためのあなたの第二であります

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); 
     } 

    } 
関連する問題