Java 嵌套为循环错误!空检查不为';不存在

Java 嵌套为循环错误!空检查不为';不存在,java,for-loop,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].getCycleLen

我目前正在使用大小为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()){
  }

只需检查
状态[i][j+1]!=null
阻止
NullPointerException
,但它不阻止代码引发
IndexOutOfBoundsException

要检查
索引自动边界
,您需要对照允许的最大索引检查
索引
。依赖于使用null检查元素是没有意义的。如果索引超出范围,您甚至无法访问元素,因此
null
检查可能甚至无法
检查

另外,如果在
if
中有这么多条件,最好在
嵌套的
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.
}
if(索引<3){
//您现在可以访问'array[index]`,因为它现在是安全的
//此外,您还可以在此处添加“NPE”复选框。
}
这是因为你的指数是以0为基础的。所以最大可访问索引是
max-1
,其中
max
是数组的大小


您可以在数组的
数组中调整相同的逻辑,只需检查
状态[i][j+1]!=null
阻止
NullPointerException
,但它不阻止代码引发
IndexOutOfBoundsException

要检查
索引自动边界
,您需要对照允许的最大索引检查
索引
。依赖于使用null检查元素是没有意义的。如果索引超出范围,您甚至无法访问元素,因此
null
检查可能甚至无法
检查

另外,如果在
if
中有这么多条件,最好在
嵌套的
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.
}
if(索引<3){
//您现在可以访问'array[index]`,因为它现在是安全的
//此外,您还可以在此处添加“NPE”复选框。
}
这是因为你的指数是以0为基础的。所以最大可访问索引是
max-1
,其中
max
是数组的大小


您可以在数组的
数组中调整相同的逻辑

从您的描述中可以很清楚地看到,当您得到异常时,
j==1
。当这种情况发生时,
state[i][j+1]
将抛出一个
ArrayIndexOutOfBoundsException
而不是像您所期望的那样计算为
null


j
中代码不会抛出
ArrayIndexOutOfBoundsException
的唯一值是零,因此您可能希望检查该值,而不是检查
null

从您的描述中可以清楚地看到,当您得到异常时,
j==1
。当这种情况发生时,
state[i][j+1]
将抛出一个
ArrayIndexOutOfBoundsException
而不是像您所期望的那样计算为
null


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

是否可以发布完整堆栈跟踪?还有一些代码显示数组的初始化?尽量不要在和if语句中设置太多条件。此外,尝试以面向对象的方式编程,以防止使用if语句。循环在哪里?当
j
处于最后一个合法索引时,使用
j+1
作为索引最有可能出现问题。您能建议Luis采取进一步措施吗?你会怎么做?我已经使用OOP一年或两年了,我发现有时语句是不可避免的(比如这样)。如果
state[I][j+1]
试图读取
state[0][2]
一个数组,它的维度是
state[4][2]
,那么数组索引是基于0的,这是不允许的。检查
null
对无法读取的值没有帮助。可以发布完整堆栈跟踪吗?还有一些代码显示数组的初始化?尽量不要在和if语句中设置太多条件。此外,尝试以面向对象的方式编程,以防止使用if语句。循环在哪里?当
j
处于最后一个合法索引时,使用
j+1
作为索引最有可能出现问题。您能建议Luis采取进一步措施吗?你会怎么做?我已经使用OOP一年或两年了,我发现有时语句是不可避免的(比如这样)。如果
state[I][j+1]
试图读取
state[0][2]
一个数组,它的维度是
state[4][2]
,那么数组索引是基于0的,这是不允许的。检查
null
对无法读取的值没有帮助。堆栈跟踪是:线程“Timer-0”java.lang.ArrayIndexOutOfBoundsException:2位于NatComp.data$1.run(data.java:67)位于java.util.TimerThread.mainLoop(Timer.java:512)位于java.util.TimerThread.run(Timer.java:462)有没有一种方法可以在不检查单元格是否为空的情况下检查单元格是否存在?堆栈跟踪是:线程“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)有什么方法可以检查单元格是否存在