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

设置固定数组新大小时如何规避NullPointerException

嘿,我来帮你拆解这个问题并给出可行的解决方案~

先搞懂为什么会触发NullPointerException

你这段代码的核心问题是Java的参数传递规则:方法参数里的x是按值传递的——你在create方法里给x赋值new String[y][y],只是修改了方法内部这个局部变量的引用,外面原本的二维数组变量根本没被改变,还是null。所以当你在方法外尝试获取它的行长度时,自然就抛出空指针异常了。

除了直接使用外部变量,还有这些规避方法

方法1:让方法返回新创建的二维数组

这是最符合Java编码习惯的方案,把创建数组的逻辑封装后,将新数组返回给调用方:

public static String[][] create(int y) {
    return new String[y][y];
}

// 调用示例
String[][] mySquareArray = create(4);
int rowLength = mySquareArray[0].length; // 这里就能正常获取长度了

这种方式清晰直观,也避免了参数传递带来的引用混乱问题。

方法2:用包装类模拟"引用传递"

Java没有真正的引用传递,但可以用一个简单的容器类把数组包装起来,这样修改容器内的数组引用时,外部就能感知到变化:
首先定义一个包装类:

class ArrayWrapper {
    String[][] array;
}

然后修改你的create方法:

public static void create(ArrayWrapper wrapper, int y) {
    wrapper.array = new String[y][y];
}

// 调用示例
ArrayWrapper wrapper = new ArrayWrapper();
create(wrapper, 5);
int rowLength = wrapper.array[0].length; // 正常工作

这个方案适合你不想改动方法返回值类型的场景,但需要额外定义包装类,相对繁琐,一般非必要不推荐。

方法3:提前初始化数组,在方法内填充元素(如果适配你的场景)

如果你的需求不是完全创建新数组,而是给已有的数组填充内容(注意Java数组长度固定,无法动态扩容),可以调整方法逻辑:

import java.util.Arrays;

public static void fillSquareArray(String[][] x, int y) {
    // 先校验传入的数组是否符合正方形大小
    if (x == null || x.length != y || x[0].length != y) {
        throw new IllegalArgumentException("数组不符合指定的正方形大小");
    }
    // 这里可以填充数组元素
    for (int i = 0; i < y; i++) {
        Arrays.fill(x[i], "default");
    }
}

// 调用示例
String[][] myArray = new String[3][3];
fillSquareArray(myArray, 3);
int rowLength = myArray[0].length; // 正常获取长度

这个方案只适用于你已经提前初始化好数组的场景,和你原本的创建数组需求略有不同,但也算一种规避NPE的思路。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:40:08