嵌套循环错误,!null 检查不存在的元素



我目前正在大小为 4,2 的 2D 数组中使用嵌套的 for 循环。当我运行我的程序时,我在下一行得到索引越界异常

  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)

仅检查state[i][j+1] != null会阻止NullPointerException,但不会阻止代码引发IndexOutOfBoundsException

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

另外,如果你的if有这么多条件,最好将它们分开nested,如果,外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 - 1 ,其中max是数组的大小。

您可以在array of array中调整相同的逻辑。

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

代码不会引发ArrayIndexOutOfBoundsException的唯一j值为零,因此您可能需要检查该值,而不是检查null

最新更新