显示java.lang.NullPointerException

时间:2011-01-08 19:32:11

标签: java arrays nullpointerexception

我刚刚开始使用java,我正在尝试创建一个Dog类对象数组,我收到了这个错误:

  

线程“main”中的异常java.lang.NullPointerException

在这一行:

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

5 个答案:

答案 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对象填充你的数组(这似乎是你原来的意图),让我们试试这个:

  1. 创建数组(就像您已经做过的那样)
  2. 遍历数组并在每个“slot”中创建新的Dog对象
  3. 访问数组中的一个Dog并调用方法setSize()

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