我刚刚开始使用java,我正在尝试创建一个Dog类对象数组,我收到了这个错误:
线程“main”中的异常java.lang.NullPointerException
在这一行:
Dog[] dogsList = new Dog[7];
dogsList[4].setSize(4);
答案 0 :(得分:25)
创建数组时,这是引用的数组 - 最初所有这些引用都为null,因此它们不是指{{1}的任何实例 }}。您需要创建一个实例,如下所示:
Dog
或者,您可能已经从其他地方引用了Dog[] dogsList = new Dog[7];
dogsList[4] = new Dog();
dogsList[4].setSize(4);
:
Dog
一点背景
要理解的最重要的事情之一是对象和引用之间的区别。引用是一种获取对象的方式 - 多个引用可以引用同一个对象。例如:
Dog fido = new Dog();
// Other code here
dogsList[4] = fido;
dogsList[4].setSize(4);
在这里,Dog x = new Dog();
Dog y = x;
x.setName("Fido");
System.out.println(x.getName()); // Will print "Fido"
和x
变量的值不是狗...它们是狗的引用(或者null,我会来在一分钟内)。这条线
y
将Dog y = x;
的初始值设置为y
的值 - 因此这两个变量引用相同的x
对象。
现在Dog
是一个特殊的引用值,它不引用任何对象。如果您尝试取消引用空引用(通常使用null
运算符,而且还使用数组索引等内容),则会引发NullPointerException
。
<强>阵列强>
创建数组时,会立即使用该类型的默认值填充所有元素。对于0的数字类型,.
的数字类型为false,而boolean
的数字类型为0.对于任何引用类型(类),它是空引用。所以当你这样做时:
char
相当于:
Dog[] dogsList = new Dog[7];
因此,在原始代码中,Dog[] dogsList = { null, null, null, null, null, null, null };
的值为null。然后,您尝试取消引用该空引用以在引用的对象上调用dogsList[4]
...并且爆炸!你得到一个setSize
。
这个问题涉及很多非常重要的概念,所以请随时询问有关任何具体要点的更多细节。
答案 1 :(得分:3)
因为第4个元素dogsList[4]
为NULL。您需要阅读Java中的数组。
请参阅:http://download.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html并结束阅读。
答案 2 :(得分:3)
您已实例化数组以容纳Dogs。您尚未实例化数组中的对象。
所以
Dog[] dogList = new Dog[7];
dogList[4] = new Dog();
dogList[4].setSize(4);
答案 3 :(得分:2)
您尝试在setSize
值上调用null
。您需要创建新的Dog
对象,并在此数组的单元格中引用它。
Dog[] dogsList = new Dog[7];
dogList[4] = new Dog();
dogsList[4].setSize(4);
答案 4 :(得分:1)
其他帖子是正确的(没有双关语;),所以我会给你另一种方法来实例化你的Dog对象。
如前所述,您的代码不会使用7个Dog对象填充新数组,而是创建一个大小为7的数组,该数组从包含空引用开始。这些引用可以指向Dog的新实例,但直到您手动执行此操作。
所以,要用新的Dog对象填充你的数组(这似乎是你原来的意图),让我们试试这个:
Dog[] dogsList = new Dog[7];
for(int i=0; i<dogsList.length; i++) {
dogsList[i] = new Dog();
}
//will work because each slot in dogsList now points to a Dog instance
dogsList[4].setSize(4);