判断数组是否为空或者是否有效的代码如下:
java
复制代码
if (array == null || array.length == 0 || array[0].length == 0) {
return new int[0];
}
这段代码进行三次判断的原因是确保数组在各个层级上的有效性:
-
array == null:- 这是为了检查传入的数组是否为
null。如果数组为null,那么访问它的任何元素都会引发NullPointerException。
- 这是为了检查传入的数组是否为
-
array.length == 0:- 这是为了检查传入的数组是否是一个空的一维数组,即数组的长度为 0。如果数组长度为 0,则意味着数组中没有任何元素或子数组,此时访问
array[0]会引发ArrayIndexOutOfBoundsException。
- 这是为了检查传入的数组是否是一个空的一维数组,即数组的长度为 0。如果数组长度为 0,则意味着数组中没有任何元素或子数组,此时访问
-
array[0].length == 0:- 这是为了检查数组中的第一个子数组是否为空。如果二维数组的第一个子数组为空,那么二维数组就没有有效的内容。即使二维数组本身不为空,但其子数组为空的话,访问其他的子数组元素仍然会引发
ArrayIndexOutOfBoundsException或其他异常。
- 这是为了检查数组中的第一个子数组是否为空。如果二维数组的第一个子数组为空,那么二维数组就没有有效的内容。即使二维数组本身不为空,但其子数组为空的话,访问其他的子数组元素仍然会引发
举例说明
-
array == null:java 复制代码 int[][] array = null; if (array == null) { System.out.println("Array is null"); } -
array.length == 0:java 复制代码 int[][] array = new int[0][]; if (array.length == 0) { System.out.println("Array length is 0"); } -
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"); }
为什么需要三个判断
- 安全性:每个判断都覆盖了一个潜在的异常情况,确保代码不会因为
NullPointerException或ArrayIndexOutOfBoundsException而崩溃。 - 健壮性:代码更加健壮,能够处理不同的无效输入情况,确保在任何无效输入情况下都返回一个空的数组
new int[0]。
只进行一次判断的问题
如果只进行一次判断,例如只判断 array == null 或 array.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]; }- 如果
array为null,会引发NullPointerException。 - 如果
array不为空,但array[0]为长度为 0 的子数组,访问array[0][0]会引发ArrayIndexOutOfBoundsException。
- 如果
通过三次判断,可以全面覆盖可能的异常情况,确保代码在各种情况下都能安全运行。