我目前正在大小为 4,2 的二维数组中使用嵌套 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
,您需要根据允许的最大索引检查您的索引
。依赖于检查 null 元素是没有意义的。如果索引越界,您甚至无法访问这些元素,因此 null
检查甚至可能不会被检查
。
此外,如果 if
中有如此多的条件,最好将它们放在 nested
if 中,并使用外部 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
是数组的大小。
您可以在数组的数组
中采用相同的逻辑。
关于java - 嵌套 for 循环错误,使用 !null 检查不存在的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13458391/