2

我编写了一个简短的脚本来了解 Java 数组:

class Dog {
  String name;
  void bark() {
    System.out.println(name + " is barking");
  }

  void eat() {
    System.out.println(name + " is eating");
  }
}

class mypets {
    public static void main(String [] args) {

    Dog dogA = new Dog();

    dogA.name="Lassy";
    dogA.bark();
    dogA.eat();

    Dog[] myDogs = new Dog[3];
    myDogs[0].name = "Barney";
    myDogs[0].bark();
  }
}

然后我编译并运行我的程序:

C:\Java>javac mypets.java

C:\Java>java mypets
Lassy is barking
Lassy is eating
Exception in thread "main" java.lang.NullPointerException
        at mypets.main(mypets.java:22)

我做错了什么?我试着用谷歌搜索那个可怕的“java.lang.NullPointerException”,但老实说我现在很困惑。

4

6 回答 6

7

数组就像一排可以容纳对象的盒子;但是,当您创建一个数组时,这些框是空的。这NullPointerException是 Java 告诉您这一点的方式。所以,当你说

Dog[] myDogs = new Dog[3];
myDogs[0].name = "Barney";

您试图Dog在第一个框中设置名称,但没有这样的名称Dog- 该框是空的。你需要Dog在盒子里放一个来完成这项工作:

Dog[] myDogs = new Dog[3];
myDogs[0] = new Dog();
myDogs[0].name = "Barney";

然后它将起作用。

于 2013-05-28T04:07:05.693 回答
2

当你初始化一个数组时,数组的每个元素都被赋予一个默认值。在对象的情况下,默认值为 null。null在引用上调用方法会产生NullPointerException. 您必须实例化每个Dog使用new

Dog[] myDogs = new Dog[3];

myDogs 的每个元素都分配了 null。

for(int i = 0; i < myDogs.length; i ++) {
    myDogs[i] = new Dog();
}
于 2013-05-28T04:07:05.560 回答
1

您需要初始化数组中的每个引用。以下是编辑后的代码。
有关更多信息,请参阅

 class Dog {
      String name;
      void bark() {
        System.out.println(name + " is barking");
      }

      void eat() {
        System.out.println(name + " is eating");
      }
    }

    class mypets {
        public static void main(String [] args) {

        Dog dogA = new Dog();

        dogA.name="Lassy";
        dogA.bark();
        dogA.eat();

        Dog[] myDogs = new Dog[3];

        //Lines Added
        for(int i=0; i<3; i++)
            myDogs[i] = new Dog();
        //End   

        myDogs[0].name = "Barney";
        myDogs[0].bark();
      }
    }
于 2013-05-28T04:16:41.403 回答
1

NullPointException基本上意味着您正在尝试引用尚未初始化的一个或多个对象...

在您的代码中,您正在做...

Dog[] myDogs = new Dog[3];

这将创建一个可以包含 3 个元素的数组Dog,它不会创建 的任何实例Dog,所以当你这样做时......

myDogs[0].name = "Barney";
myDogs[0].bark();

myDogs[0]实际上是null

相反,您需要先Dog为元素分配一个新元素,然后再尝试访问它。

myDogs[0] = new Dog();
myDogs[0].name = "Barney";
myDogs[0].bark();

您可能想阅读更多详细信息的数组

于 2013-05-28T04:08:25.043 回答
0

NullPointerException表示您(您的参考变量)指向 null(对象)是一个例外,但您打算对其进行一些操作(这应该是错误的)。

用最简单的话来说,如果你声明一个变量并且不分配一个对象,它指向 null

MyClass myRef;//equivalent to MyClass myRef = null;

然后尝试对其进行一些操作

myRef.doSomething(); //it's a null pointer exception

然后你得到NullPointerException

于 2013-05-28T04:14:37.773 回答
0

您需要先创建对象并将其放入数组中,然后才能使用它。

喜欢

Dog[] myDogs = new Dog[3];
myDogs[0] = new Dog();
myDogs[0].name = "Barney";
myDogs[0].bark();
于 2013-05-28T04:08:47.513 回答