我刚开始学习Java和我试图创建Dog类对象的数组,我得到这个错误:显示java.lang.NullPointerException
Exception in thread "main" java.lang.NullPointerException
在这一行:
Dog[] dogsList = new Dog[7];
dogsList[4].setSize(4);
我刚开始学习Java和我试图创建Dog类对象的数组,我得到这个错误:显示java.lang.NullPointerException
Exception in thread "main" java.lang.NullPointerException
在这一行:
Dog[] dogsList = new Dog[7];
dogsList[4].setSize(4);
当您创建一个数组,这就是引用阵列 - 并初步所有这些引用都为空,所以他们没有提及任何实例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
和y
变量的值是不是狗...他们引用狗(或空,我就来上一分钟)。行
Dog y = x;
设置的y
到的x
值的初始值 - 这样的两个变量是指相同的Dog
对象。
现在null
是一个特殊的参考值,并不是指任何对象。如果您尝试解除引用空引用(通常与.
运算符,但也与像数组索引的东西),则引发NullPointerException
。
阵列
当您创建一个数组,所有元素都被立即填充的类型的默认值。对于0的数字类型,对于boolean
它是错误的,对于char
它是字符0.对于任何参考类型(类),它是空引用。所以,当你这样做:
Dog[] dogsList = new Dog[7];
这相当于:
Dog[] dogsList = { null, null, null, null, null, null, null };
因此,在你原来的代码中,dogsList[4]
值为null。然后尝试解引用空引用,以便在引用的对象上调用setSize
...并且爆炸!你得到一个NullPointerException
。
在这个问题中涉及到很多非常重要的概念,所以请随时索要任何具体问题的更多细节。
您试图致电setSize
对null
值。您需要创建新的Dog
对象并将其引用到此数组的单元格中。
因为第4个元素dogsList[4]
为NULL。您需要阅读Java中的数组。
请参考:http://download.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html并且首尾阅读。
你已经实例化数组来保存狗。您尚未实例化数组中的对象。
所以
Dog[] dogList = new Dog[7];
dogList[4] = new Dog();
dogList[4].setSize(4);
的其他职位被点上(没有双关语意),所以我给你另一种方法来实例化你的狗的对象。如前所述,您的代码不会使用7个Dog对象填充新数组,而是会创建一个大小为7的数组,该数组的起始位置包含空引用。这些参考文献可以将指向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);
谢谢@Jon Skeet,你的回答真的很有帮助! – Hazmat 2017-09-30 04:04:52