Java 嵌套为循环错误!空检查不为';不存在
我目前正在使用大小为4,2的二维数组中的嵌套for循环。 当我运行我的程序时,我在下面的一行中得到索引越界异常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
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)有什么方法可以检查单元格是否存在