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

为何必须初始化成员数组?未初始化触发NullPointerException原因解析

为什么未初始化数组会触发NullPointerException?

嘿,这个问题其实是Java里引用类型初始化的典型小坑,咱们把它拆解开说清楚:

核心原因:数组引用的默认值是null

在Java里,所有引用类型(包括数组)的默认值都是null。当你只写Integer arryMem[];的时候,你只是声明了一个数组引用变量,但它并没有指向任何实际存在的数组对象——就像你只说了“我有一个装苹果的篮子”,但实际上手里根本没有篮子,是空的。

构造函数里的操作触发了空引用访问

看你的构造函数代码:

BubRec(Integer ary[]) {
    for (int i = 0; i <= ary.length - 1; i++) {
        arryMem[i] = ary[i]; // 这里要访问arryMem指向的数组元素
    }
    n = arryMem.length;
}

当arryMem是null的时候,你尝试访问arryMem[i]或者arryMem.length,本质上是在试图对一个空引用执行“访问数组元素/长度”的操作——这就像你对着空气想拿篮子里的苹果,JVM自然会抛出NullPointerException来告诉你:“你要操作的东西根本不存在!”

初始化后为什么正常?

当你写Integer arryMem[] = {0, 0, 0, 0, 0, 0, 0};时,这行代码做了两件事:

  1. 创建了一个长度为7的Integer数组对象,并且把每个元素初始化为0;
  2. 让arryMem这个引用变量指向这个刚创建的数组对象。

这时候arryMem不再是null,它有了实实在在的数组可以操作,构造函数里的循环就能正常给数组元素赋值,自然不会抛出异常了。

额外小建议:避免固定数组长度的潜在问题

你的代码还有个小隐患:如果传入的ary长度大于7,会抛出ArrayIndexOutOfBoundsException(数组越界)。如果想让代码更灵活,可以在构造函数里动态初始化数组:

BubRec(Integer ary[]) {
    // 根据传入数组的长度,动态创建对应大小的数组
    arryMem = new Integer[ary.length];
    for (int i = 0; i < ary.length; i++) {
        arryMem[i] = ary[i];
    }
    n = arryMem.length;
}

这样不管传入的数组多长,都能适配,也不用提前固定arryMem的长度啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:02:15