判断数组是否为空或者是否有效问题

416 阅读2分钟

判断数组是否为空或者是否有效的代码如下:

java
复制代码
if (array == null || array.length == 0 || array[0].length == 0) {
    return new int[0];
}

这段代码进行三次判断的原因是确保数组在各个层级上的有效性:

  1. array == null

    • 这是为了检查传入的数组是否为 null。如果数组为 null,那么访问它的任何元素都会引发 NullPointerException
  2. array.length == 0

    • 这是为了检查传入的数组是否是一个空的一维数组,即数组的长度为 0。如果数组长度为 0,则意味着数组中没有任何元素或子数组,此时访问 array[0] 会引发 ArrayIndexOutOfBoundsException
  3. array[0].length == 0

    • 这是为了检查数组中的第一个子数组是否为空。如果二维数组的第一个子数组为空,那么二维数组就没有有效的内容。即使二维数组本身不为空,但其子数组为空的话,访问其他的子数组元素仍然会引发 ArrayIndexOutOfBoundsException 或其他异常。

举例说明

  1. array == null

    java
    复制代码
    int[][] array = null;
    if (array == null) {
        System.out.println("Array is null");
    }
    
  2. array.length == 0

    java
    复制代码
    int[][] array = new int[0][];
    if (array.length == 0) {
        System.out.println("Array length is 0");
    }
    
  3. array[0].length == 0

    java
    复制代码
    int[][] array = { new int[0], new int[0] };
    if (array[0].length == 0) {
        System.out.println("First sub-array length is 0");
    }
    

为什么需要三个判断

  • 安全性:每个判断都覆盖了一个潜在的异常情况,确保代码不会因为 NullPointerExceptionArrayIndexOutOfBoundsException 而崩溃。
  • 健壮性:代码更加健壮,能够处理不同的无效输入情况,确保在任何无效输入情况下都返回一个空的数组 new int[0]

只进行一次判断的问题

如果只进行一次判断,例如只判断 array == nullarray.length == 0,可能会出现以下问题:

  • 只判断 array == null

    java
    复制代码
    if (array == null) {
        return new int[0];
    }
    
    • 如果 array 不为 null,但它是一个长度为 0 的数组,则访问 array[0] 会引发 ArrayIndexOutOfBoundsException
  • 只判断 array.length == 0

    java
    复制代码
    if (array.length == 0) {
        return new int[0];
    }
    
    • 如果 arraynull,会引发 NullPointerException
    • 如果 array 不为空,但 array[0] 为长度为 0 的子数组,访问 array[0][0] 会引发 ArrayIndexOutOfBoundsException

通过三次判断,可以全面覆盖可能的异常情况,确保代码在各种情况下都能安全运行。