You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]);
    }
}

代码说明

  1. 先遍历找到第一个null的位置,避免硬编码循环范围,适配不同长度的数组。
  2. 移动元素时直接操作二维数组的元素(即一维数组的引用),不会去访问null数组的下标,从根源避免空指针。
  3. 最后将数组末尾设为null,保证数组长度与原数组一致。

运行后数组会变为目标格式:{{"sun", "moon"}, {"black", "white"}, {"dog", "cat"}, null, null}。

内容的提问来源于stack exchange,提问作者KLG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:30:49