对象数组初始化引发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
相关产品推荐
相关产品推荐

