Java:仅用for循环将二维数组中的null移至非null元素右侧
问题需求
给定二维数组String[][] arr2D = {{"sun", "moon"}, null, {"black", "white"}, {"dog", "cat"}, null},需遍历数组将第一个null移至["dog", "cat"]的紧邻右侧或数组末尾,最终得到{{"sun", "moon"}, {"black", "white"}, {"dog", "cat"}, null, null}。
错误尝试及报错
改编一维数组写法时触发空指针异常,代码如下:
// I'm hardcoding i < 4 because there are 4 elements between and including ["sun", "moon"] and ["dog", "cat"] for(int i = 0; i < 4; i++) { if(arr2D[i] == null) { for(int j = i + 1; j < 4; j++) { arr2D[j - 1][0] = arr2D[j][0]; arr2D[j- 1][1] = arr2D[j][1]; } arr2D[4 - 1] = null; break; } }
报错信息翻译为:
Exception in thread "main" java.lang.NullPointerException: 无法存储到对象数组,因为"items[...]"为null
问题原因
原代码错误在于:当arr2D[i]为null时,arr2D[j-1]就是这个null数组,此时去访问arr2D[j-1][0]或arr2D[j-1][1],自然会触发空指针——因为null数组无法被下标访问。
正确实现代码
无需操作二维数组内的单个字符串,直接移动一维数组的引用即可:
String[][] arr2D = {{"sun", "moon"}, null, {"black", "white"}, {"dog", "cat"}, null}; // 定位第一个null的索引 int firstNullIndex = -1; for (int i = 0; i < arr2D.length; i++) { if (arr2D[i] == null) { firstNullIndex = i; break; } } // 若找到第一个null,将其后的元素依次前移 if (firstNullIndex != -1) { for (int j = firstNullIndex; j < arr2D.length - 1; j++) { arr2D[j] = arr2D[j + 1]; } // 数组末尾补null,保证长度不变 arr2D[arr2D.length - 1] = null; } // 输出验证结果 for (String[] subArr : arr2D) { if (subArr == null) { System.out.println("null"); } else { System.out.println(subArr[0] + ", " + subArr[1]); } }
代码说明
- 先遍历找到第一个
null的位置,避免硬编码循环范围,适配不同长度的数组。 - 移动元素时直接操作二维数组的元素(即一维数组的引用),不会去访问
null数组的下标,从根源避免空指针。 - 最后将数组末尾设为
null,保证数组长度与原数组一致。
运行后数组会变为目标格式:{{"sun", "moon"}, {"black", "white"}, {"dog", "cat"}, null, null}。
内容的提问来源于stack exchange,提问作者KLG
相关产品推荐
相关产品推荐

