You need to enable JavaScript to run this app. Java二维数组同地址复制方法与java.lang.NullPointerException写空数组问题
优惠活动
大模型
产品
解决方案
定价
更多

Java二维数组同地址复制方法与java.lang.NullPointerException写空数组问题

空指针问题修复与二维数组引用复制实现

异常触发原因

你代码中类成员fares仅完成了变量声明,未进行实例化分配内存,其默认值为null。直接对null类型的数组执行索引写入操作时,就会触发java.lang.NullPointerException: Attempt to write to null array报错。
对比你代码中单数组Stops的赋值逻辑:你是直接将入参stopsArg的引用整体赋值给成员变量,没有在当前类内单独初始化数组空间,因此没有触发空指针;而二维数组你选择了逐行赋值的方式存储数据,但没有先为当前类的fares变量开辟对应大小的数组内存空间,最终导致写入null数组的异常。

匹配需求的实现方案

你的核心需求是:复制二维数组结构,让新数组内的元素和原数组的元素指向同一内存地址,不做深拷贝。实现时需要完成两个核心步骤:

  • 先为类内的fares二维数组成员分配和入参faresArg长度一致的顶层数组空间,解决null写入异常
  • 逐行赋值时直接复用原数组的行引用,不单独复制行内的字符串对象,保证元素内存地址完全一致
    修正后的完整代码示例:
public class PostData {
    String url;
    String busNumber;
    int countStops;
    int countPairs;
    String[] Stops;
    String[][] fares;

    PostData(String urlArg, String busNumberArg, int countStopsArg, int countPairsArg, String[] stopsArg, String[][] faresArg) {
        url = urlArg;
        busNumber = busNumberArg;
        countStops = countStopsArg;
        countPairs = countPairsArg;
        Stops = stopsArg;
        // 初始化二维数组的顶层结构,分配与入参等长的空间
        fares = new String[faresArg.length][];
        int c = 0;
        for (String[] array : faresArg) {
            // 直接赋值原行数组的引用,行内元素与原数组共享内存
            fares[c++] = array;
        }
    }
}

等价简化写法

如果不想手动编写循环逻辑,可直接使用JDK内置的Arrays.copyOf工具方法完成同等效果的复制:

import java.util.Arrays;

// 构造器内的fares赋值逻辑可替换为:
fares = Arrays.copyOf(faresArg, faresArg.length);

该方法会为顶层二维数组分配新的内存空间,且逐行保留原数组的行引用,和手写循环的内存指向逻辑完全一致,同样不会破坏你要求的元素内存地址共享效果。

方案适配性说明

  • 实现后顶层的fares数组是PostData实例独立持有的对象,和外部传入的原二维数组的顶层引用不绑定
  • 二维数组中每一行的一维数组、以及数组内存的字符串对象,都会和原数组的对应元素指向同一内存地址,完全符合复制要求
  • 原主方法中的调用代码无需改动,即可正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 20:24:05