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
相关产品推荐
相关产品推荐

