设置固定数组新大小时如何规避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
相关产品推荐
相关产品推荐

