2011-01-08 124 views
9

我刚开始学习Java和我试图创建Dog类对象的数组,我得到这个错误:显示java.lang.NullPointerException

Exception in thread "main" java.lang.NullPointerException

在这一行:

Dog[] dogsList = new Dog[7]; 
dogsList[4].setSize(4); 

回答

24

当您创建一个数组,这就是引用阵列 - 并初步所有这些引用都为空,所以他们没有提及任何实例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" 

这里,xy变量的值是不是狗...他们引用狗(或空,我就来上一分钟)。行

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

在这个问题中涉及到很多非常重要的概念,所以请随时索要任何具体问题的更多细节。

+0

谢谢@Jon Skeet,你的回答真的很有帮助! – Hazmat 2017-09-30 04:04:52

2

您试图致电setSizenull值。您需要创建新的Dog对象并将其引用到此数组的单元格中。

3

你已经实例化数组来保存狗。您尚未实例化数组中的对象。

所以

Dog[] dogList = new Dog[7]; 
dogList[4] = new Dog(); 
dogList[4].setSize(4); 
1

的其他职位被点上(没有双关语意),所以我给你另一种方法来实例化你的狗的对象。如前所述,您的代码不会使用7个Dog对象填充新数组,而是会创建一个大小为7的数组,该数组的起始位置包含空引用。这些参考文献可以将指向Dog的新实例,但直到您手动完成为止。

所以,填补了新的狗对象的数组(这似乎是你的原意),让我们试试这个:

  1. 整个创建数组(因为你已经做了)
  2. 迭代阵列和在每个“时隙”
  3. 访问创建新的犬对象阵列中的狗中的一个,并调用方法的setSize()

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); 

相关问题