我目前正在大小为 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
。