【问题标题】:check if 2d array is valid检查二维数组是否有效
【发布时间】:2026-01-10 11:35:01
【问题描述】:

假设 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。但是为了学习的目的,有没有别的办法?

【问题讨论】:

  • if(scanArray.length > 0) ?

标签: java arrays


【解决方案1】:

如果someMethodThatCenReturnZero() 返回zeroscanArray.length 将给出zero。所以你的情况可能是:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果此行成功完成:

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

      那么这永远不会发生:

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

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

      【讨论】:

        【解决方案4】:

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

        长度为 0 的数组不是null

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

        【讨论】:

          【解决方案5】:

          当你打电话给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 &lt; scanArray.length 时运行循环。 i 被初始化为 0,因此当 length0 时,for 循环永远不会运行。

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

          您的原始方法遵循在 Python 世界中普遍创造的一种风格,即 EAFP(请求宽恕比许可更容易),也就是说,如果出现异常,您只需去做并处理它们。

          for 循环方法或length 检查遵循 LBYL(跳前检查)方法,该方法采取必要步骤来避免可能抛出 Exception 的情况(即 null 检查就像您在例如scanArray == null)。

          由于Java 是一种非常明确的语言,因此通常首选 LBYL 编码风格,但两者都是有效的,一个只是更偶然的风险 (EAFP)。 This discussion is worth looking at.

          【讨论】: