0

現在、サイズ 4,2 の 2D 配列でネストされた for ループを使用しています。プログラムを実行すると、次の行で index out of bounds Exception が発生します

  else if (state[i][j+1] != null 
           && state[i][j].getFlash() <= state[i][j].getCycleLength() 
           && state[i][j+1].getCycleLength() == state[i][j].getCycleLength()){
  }

範囲外のインデックスは 2 です。 [i][j+1] が null でないかどうかをチェックしていなければエラーは理解できますが、チェックの例外はわかりませんか? !null チェックを回避しようとしましたが、プログラムはこの行でまだ失敗します。

どんな助けでも大歓迎です。

Stack trace:
Exception in thread "Timer-0" java.lang.ArrayIndexOutOfBoundsException: 2
at NatComp.data$1.run(data.java:67)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
4

2 に答える 2

3

をチェックするだけで がstate[i][j+1] != null防止NullPointerExceptionされますが、コードがIndexOutOfBoundsException.

を確認するには、最大許容インデックスに対してIndexOutOfBounds確認する必要があります。indices要素を null でチェックすることに頼っても意味がありません。インデックスが範囲外の場合、要素にアクセスすることさえできないため、nullチェックも行われない可能性がありますchecked

また、非常に多くの条件が にある場合は、それらをififに分けて、外側でをチェックし、内側で実際の条件チェックを行うことをお勧めします。その方が読みやすいでしょう。nestedifIndexOutOfBoundsif

たとえば、配列が として宣言されている場合new int[3]、インデックスにアクセスする前に、次のチェックを追加できます。

if (index < 3) {
     // you can now access `array[index]`, as it is safe now
     // Also, you can add a check for `NPE` here.
}

これは、インデックスが 0 ベースであるためです。したがって、アクセス可能な最大インデックスは ですmax - 1。ここで、maxは配列のサイズです。

で同じロジックを適応させることができますarray of array

于 2012-11-19T16:52:06.153 に答える
2

j==1あなたの説明から、例外が発生したときは明らかです。その場合、期待どおりに評価するのではなく、state[i][j+1]をスローします。ArrayIndexOutOfBoundsExceptionnull

jコードが をスローしないの唯一の値ArrayIndexOutOfBoundsExceptionは 0 ですnull

于 2012-11-19T16:52:20.390 に答える