2013-05-28 36 views
2

我编写了一个简短的脚本,以了解Java数组:这是什么java.lang.NullPointerException?

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) 

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

回答

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"; 

然后它会奏效。

+0

非常感谢。完全理解。 –

2

当您初始化一个数组时,数组中的每个元素都被分配一个默认值。在对象的情况下,默认值为空。在null参考上调用方法的结果为NullPointerException。您必须使用new

Dog[] myDogs = new Dog[3]; 

myDogs的每个元素赋值为null实例每个Dog

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

太棒了!感谢那个循环。 –

1

NullPointException基本上意味着您正试图引用尚未初始化的对象或对象......

在代码中,你正在做......

Dog[] myDogs = new Dog[3]; 

这将创建可以包含的Dog 3个元素的数组,它不创造任何Dog情况,所以当你做到这一点...

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

myDogs[0]实际上是null

取而代之,您需要首先将一个新的Dog分配给您尝试访问它之前的元素。

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

你可能想通过更多的细节

+0

谢谢,mucj = h为链接。 –

+0

不用担心,希望它可以帮助 – MadProgrammer

0

您需要创建一个对象,并把数组中,然后才能使用它Arrays采取一读。

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

谢谢队友。感谢 –

+0

@RamlangPorigi只要您在Java中,NullPointerException将与您同在。所以很好理解这个概念。 :D –

0

NullPointerException说,这是你(你的参考变量)指向空(对象)的例外,但你打算做一些操作(这应该是错误的) 。

最简单地说,如果你声明一个变量并没有指定它指向空

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

一个对象,然后尝试做就可以了

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

那么你得到NullPointerException一些操作

1

您需要初始化阵列中的每个引用。以下是编辑的代码。
有关更多信息,请参阅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(); 
     } 
    } 
+0

感谢Asad纠正代码。 –

相关问题