java - 嵌套 for 循环错误,使用 !null 检查不存在的元素

标签 java for-loop

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

相关文章:

java - 检查 RemoteView 开关的 boolean 值的方法?

r - R 中的子列表命名

r - 努力在 tidyverse 中优雅地改变列

arrays - 如何检查变量是否在 PowerShell 中的数组中?

java - 在 Java 1.7u80 上运行 JavaFX 应用程序时出现问题

java - Spring MVC 中需要 Model POJO 吗?

java - 是否有正在积极开发中的 Prefuse 的 Java 替代品?

javascript - while循环没有跳出

string - 复制文件夹名称中的空格时将文件夹名称附加到文件名

java - Windows 10 Cygwin 中的 OpenMPI java 绑定(bind)