0

我目前在大小为 4,2 的二维数组中使用嵌套的 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 检查,但程序在这一行仍然失败。

任何帮助将不胜感激。

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

只是检查prevent ,但它不会阻止代码state[i][j+1] != null引发.NullPointerExceptionIndexOutOfBoundsException

要检查IndexOutOfBounds,您需要indices根据最大允许索引检查您的。依靠检查带有 null 的元素是没有意义的。如果索引超出范围,您甚至无法访问元素,因此null检查可能甚至不是checked.

此外,如果您的 中有这么多条件if,最好将它们分开在nestedif 中,外部if检查IndexOutOfBounds,内部if进行实际条件检查。那将更具可读性。

例如,如果您有一个声明为 的数组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 - 1max数组的大小在哪里。

您可以在array of array.

于 2012-11-19T16:52:06.153 回答
2

从您的描述中可以清楚地看出,j==1当您遇到异常时。当这种情况发生时,state[i][j+1]会抛出一个ArrayIndexOutOfBoundsException而不是评估null你似乎期望的那样。

j您的代码不会抛出的唯一值ArrayIndexOutOfBoundsException是零,因此您可能想要检查它而不是检查null.

于 2012-11-19T16:52:20.390 回答