假设someMethodThatCenReturnZero()返回0:
int[][] scanArray = new int[someMethodThatCenReturnZero()][2];
if (scanArray == null) {
PApplet.println("null");
}
if (scanArray[0] == null) {
PApplet.println("null");
}
它不会打印null,但我得到的索引超出了绑定异常。
我可以用try块来捕获它。我也可以在创建阵列之前检查someMethodThatCenReturnZero() > 0
。但是出于学习的目的,还有另一种方式吗?
答案 0 :(得分:2)
scanArray.length
返回zero
, someMethodThatCenReturnZero()
将会zero
。所以你的情况可能是:
if(scanArray.length == 0){
PApplet.println("null");
}
答案 1 :(得分:0)
该程序无法打印null
,因为您使用scanArray
运算符实例化了new
。您可以尝试if(scanArray.length > 0)
以获得正确的结果。
答案 2 :(得分:0)
如果此行成功完成:
int[][] scanArray = new int[someMethodThatCenReturnZero()][2];
然后这种情况永远不会发生:
if (scanArray == null) {
PApplet.println("null");
}
调用new
的结果永远不会为空。相反,您应该检查scanArray.length == 0
。
答案 3 :(得分:0)
当您致电scanArray
null
而非new int[someMethodThatCenReturnZero()][2]
您收到的索引超出范围,因为如果someMethodThatCenReturnZero
返回0
,则数组的大小为0
,并且您正尝试访问第一项scanArray[0]
超出了数组的范围。
当array
被编入索引0
到(size of the array) - 1
时,或者0
大小array
没有有效索引。
Java
中的最佳做法是在假设存在0 th 元素之前检查数组的length
属性。
if (scanArray.length > 0) {
System.out.println("Non empty!");
} else {
System.out.println("Empty!");
}
如果要检查是否有任何数组元素为空:
for (int i = 0; i < scanArray.length; i++) {
if (scanArray[i] == null) {
System.out.println("The " + i + "th element is null");
}
}
此循环允许安全调用任何索引,因为在它为空的情况下,for
循环被赋予仅在i < scanArray.length
时循环运行的指令。 i
已启动0
,因此当length
为0
时,for
循环永远不会运行。
最后一个代码片段是处理可能空数组的常用方法,因为它是一个仅在array
的有效索引上循环的循环。
你原来的认可遵循一种在蟒蛇世界中常见的风格,即EAFP(更容易请求宽恕而不是许可),即你只是去做它并处理例外情况。
for
循环方法或length
检查遵循LBYL(Look Before You Leap)方法,该方法采取必要步骤以避免可能抛出Exception
的情况(即{{1像你在null
)的例子中那样进行检查。
由于scanArray == null
是一种非常明确的语言,因此LBYL编码风格通常是首选,但两者都是有效的,一种是更多的危险(EAFP)。 This discussion is worth looking at.
答案 4 :(得分:0)
你可以创建一个array of length zero,但是这个数组实际上是你期望的:一个长度为零的数组。
长度为0的数组不是null
。
尝试访问scanArray[0]
您尝试访问数组的第一个元素,但该数组没有任何元素。