繁体   English   中英

检查二维数组是否有效

[英]check if 2d array is valid

假设someMethodThatCenReturnZero()返回0:

int[][] scanArray = new int[someMethodThatCenReturnZero()][2];

if (scanArray == null) {
  PApplet.println("null");
}

if (scanArray[0] == null) {
    PApplet.println("null");
}

它不会输出null,但是我得到了超出界限的异常的索引。

我可以尝试一下来抓住它。 我也可以在创建数组之前检查someMethodThatCenReturnZero() > 0 但是出于学习目的,还有另一种方法吗?

scanArray.length会给zero如果someMethodThatCenReturnZero()返回zero 因此,您的情况可能是:

if(scanArray.length == 0){
  PApplet.println("null");
}

该程序不会输出null因为您使用new运算符实例化了scanArray 您可以尝试if(scanArray.length > 0)以获得正确的结果。

如果此行成功完成:

int[][] scanArray = new int[someMethodThatCenReturnZero()][2];

然后这将永远不会发生:

if (scanArray == null) {
   PApplet.println("null");
}

调用new的结果永远不会为空。 相反,您应该检查scanArray.length == 0

当您调用new int[someMethodThatCenReturnZero()][2]时,您使scanArray不为null

您正在接收超出范围的索引,因为如果someMethodThatCenReturnZero返回0则数组的大小为0并且您正在尝试访问数组边界之外的第一项scanArray[0]

array的索引从0(size of the array) - 1 ,或者在array大小为0的情况下,没有有效的索引。

Java最佳实践是在假定 0 元素之前检查数组的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所以当length0for循环永远不会运行。

最后一个代码段是处理可能为空的数组的常用方法,因为它是一个仅在array有效索引上循环的循环。

您最初的方法遵循的是python世界中常见的一种风格,即EAFP(比许可更容易请求宽恕),即,您只需要处理它,并在出现异常时对其进行处理。

for循环的方法或length检查遵循LBYL(看之前LEAP)这需要neccessary措施,以避免其中的情况下,方法Exception (即可能会被抛出null当你在你的例子有用于检查scanArray == null )。

由于Java是一种非常明确的语言,因此通常首选LBYL风格的编码,但两者均有效,因此一种更容易发生危险(EAFP)。 这个讨论值得一看。

您可以创建一个长度为零数组 ,但实际上该数组是您期望的:长度为零的数组。

长度为0的数组不为null

通过尝试访问scanArray[0]您试图访问数组的第一个元素,但是该数组没有任何元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM