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

对象数组初始化引发NullPointerException的原因、解决方法及问题分析

为什么对象数组调用方法时触发NullPointerException?

先来看你提供的代码:

class A {
    int a;
    public void setA(int a) {
        this.a = a;
    }
}
public class ObjArry {
    public static void main(String[] args) {
        A[] ObjectArray = new A[5];
        ObjectArray[0].setA(10); //Exception occurs in this line
        ObjectArray[1].setA(9);
        ObjectArray[2].setA(8);
        ObjectArray[3].setA(7);
        ObjectArray[4].setA(6);
    }
}

原因分析

你踩了一个新手常犯的坑:创建对象数组时,只分配了数组的容器空间,但数组里的每一个元素都是null,并没有实际生成A类的实例。

当你执行A[] ObjectArray = new A[5];这行代码时,JVM只是创建了一个能装5个A类型引用的数组,每个位置的默认值都是null(对象类型的默认初始值就是null)。这时候直接调用ObjectArray[0].setA(10),相当于对着一个空引用调用方法,必然会抛出NullPointerException。

解决方法

你需要先给数组的每个元素创建A类的实例,再调用setA方法,有两种常用方式:

方式一:逐个初始化数组元素

public class ObjArry {
    public static void main(String[] args) {
        A[] ObjectArray = new A[5];
        // 先为每个数组元素创建A的实例
        ObjectArray[0] = new A();
        ObjectArray[1] = new A();
        ObjectArray[2] = new A();
        ObjectArray[3] = new A();
        ObjectArray[4] = new A();
        // 再调用setA方法赋值
        ObjectArray[0].setA(10);
        ObjectArray[1].setA(9);
        ObjectArray[2].setA(8);
        ObjectArray[3].setA(7);
        ObjectArray[4].setA(6);
    }
}

方式二:用循环批量初始化

如果数组长度较大,用循环会更简洁高效:

public class ObjArry {
    public static void main(String[] args) {
        A[] ObjectArray = new A[5];
        // 循环创建实例并赋值
        for(int i=0; i<ObjectArray.length; i++){
            ObjectArray[i] = new A();
            ObjectArray[i].setA(10 - i);
        }
    }
}

你的初始化操作存在的问题

你只完成了数组本身的初始化,却忽略了数组中每个对象元素的初始化。对于int[]这类基本类型数组,创建后每个元素会有默认值(比如0),但对象类型数组的元素默认都是null,必须手动为每个元素创建对应的对象实例,才能安全地调用对象的方法或访问属性。

内容的提问来源于stack exchange,提问作者Ali Asghari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:08:32