为何必须初始化成员数组?未初始化触发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};时,这行代码做了两件事:
- 创建了一个长度为7的Integer数组对象,并且把每个元素初始化为
0; - 让
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
相关产品推荐
相关产品推荐

