我编写了一个简短的脚本来了解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”但老实说我现在很困惑。
答案 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中的每个引用。以下是编辑后的代码 有关详细信息,请参阅this和this。
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