繁体   English   中英

这是什么java.lang.NullPointerException?

[英]What is this java.lang.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”但老实说我现在很困惑。

数组就像一排可以容纳物体的盒子; 但是,在创建数组时,这些框是空的。 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";

然后它会工作。

初始化数组时,会为数组的每个元素分配一个默认值。 对于对象,默认值为null。 null引用上调用方法会导致NullPointerException 您必须使用new实例化每只Dog

Dog[] myDogs = new Dog[3];

myDogs的每个元素都被赋值为null。

for(int i = 0; i < myDogs.length; i ++) {
    myDogs[i] = new Dog();
}

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

您可能希望阅读有关更多详细信息的数组

您需要初始化Array中的每个引用。 以下是编辑过的代码。
获取更多信息。

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

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

喜欢

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

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

简单来说,如果声明一个变量而不指定一个对象则指向null

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

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

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

然后你得到NullPointerException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM