这是什么java.lang.NullPointerException?

时间:2013-05-28 04:05:34

标签: java nullpointerexception

我编写了一个简短的脚本来了解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”但老实说我现在很困惑。

6 个答案:

答案 0 :(得分: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";

然后它会起作用。

答案 1 :(得分: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();
}

答案 2 :(得分: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();

您可能希望详细了解Arrays

答案 3 :(得分:1)

您需要初始化Array中的每个引用。以下是编辑后的代码 有关详细信息,请参阅thisthis

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

答案 4 :(得分:0)

您需要创建对象并放入数组才能使用它。

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

答案 5 :(得分:0)

NullPointerException说你(你的引用变量)指向null(对象)是一个例外,但你打算对它做一些操作(这应该是错误的)。

简单来说,如果声明一个变量并且没有指定一个对象,则它指向null

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

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

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

然后你得到NullPointerException