当你打电话给new int[someMethodThatCenReturnZero()][2]时,你发了scanArray而不是null
您收到超出范围的索引,因为如果someMethodThatCenReturnZero 返回0,则数组的大小为0,并且您尝试访问超出数组范围的第一项scanArray[0] .
当array 被索引0 到(size of the array) - 1,或者在0 大小的情况下array 没有有效的索引。
Java 中的最佳做法是在假设存在第 0th 个元素之前检查数组的 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 循环永远不会运行。
最后一个代码 sn-p 是处理 可能为空的数组的常用方法,因为它是一个循环,仅在 array 的有效索引上循环。
您的原始方法遵循在 Python 世界中普遍创造的一种风格,即 EAFP(请求宽恕比许可更容易),也就是说,如果出现异常,您只需去做并处理它们。
for 循环方法或length 检查遵循 LBYL(跳前检查)方法,该方法采取必要步骤来避免可能抛出 Exception 的情况(即 null 检查就像您在例如scanArray == null)。
由于Java 是一种非常明确的语言,因此通常首选 LBYL 编码风格,但两者都是有效的,一个只是更偶然的风险 (EAFP)。 This discussion is worth looking at.