2013-02-03 68 views
0

我是新使用的对象数组,但无法弄清楚我做错了什么,为什么我总是得到一个空指针异常。我正在尝试创建一个Theatre类,其中包含一组Spotlight对象,这些对象可以设置为打开或关闭。但是 - 每当我调用这个数组时,我都会得到一个空指针异常。对象数组空指针异常

package theatreLights; 

public class TheatreSpotlightApp { 


public static void main(String[] args) { 

    Theatre theTheatre = new Theatre(8); 

    System.out.println("element 5 " + theTheatre.arrayOfSpotlights[5].toString()); 

} 

} 

package theatreLights; 

public class Theatre { 

spotlight[] arrayOfSpotlights; 

public Theatre(int N){ 

    arrayOfSpotlights = new spotlight[N]; 

    for (int i = 0; i < arrayOfSpotlights.length; i++) { 
     arrayOfSpotlights[i].turnOn();   
    } 

} 
} 


package theatreLights; 

public class spotlight { 
int state; 

public spotlight(){  
    state = 0; 
} 

public void turnOn(){ 
    state = 1; 
} 

void turnOff(){ 
    state = 0; 
} 

public String toString(){ 
    String stringState = ""; 
    if(state == 0){ 
     stringState = "is off"; 

    } 
    else if(state==1){ 
     stringState = "is on"; 
    } 

    return stringState; 

} 
} 

我必须做一些基本错误的创建数组,但无法弄清楚。

+0

数组使用空值进行初始化。您需要为数组的每个条目分配一个新的聚光灯,如下所示:array [2] = new spotlight()。注意:按照惯例的类名(不是语法)应该以大写字母开头。 –

+1

使您的数组包是私有的是有点冒险的,即使数组是最终的,引用仍然可以改变。私人包装比公共包装更好,但你仍然需要特别注意,当你不期望它们时,事物并没有改变。 – Kurtymckurt

+1

(我不得不提,忽略编码约定是一个非常糟糕的主意。) –

回答

2

当你做“arrayOfSpotlights = new spotlight [N];”您初始化的长度为N,你需要做的一个数组初始化也是每个对象在它:

for i=0; i<N; i++ 
    arrayOfSpotlights[i] = new spotlight(); 
    arrayOfSpotlights[i].turnOn(); 

希望我是正确的:)

+0

arrayOfSpotlights [i] = new spotlight();哇,非常感谢大家 - 这是for循环中的这条线缺失,现在整个程序(这是更长的时间!)的作品 - 再次感谢 – user2037935

+1

除了所需的括号,它是正确的。 –

+0

万岁伪代码:) – Odinn

3

取代

arrayOfSpotLights[i] = new Spotlight(); 
arrayOfSpotlights[i].turnOn();  

线

arrayOfSpotlights = new spotlight[N]; 

将创建一个聚光灯阵列。然而,它不会用聚光灯来组装这个阵列。

+0

谢谢你这个工作完美 – user2037935

1

您未创建聚光灯对象。

arrayOfSpotlights = new spotlight[N]; 

这只是创建一个对聚光灯的引用数组,而不是被引用的对象。

简单的解决办法是

for (int i = 0; i < arrayOfSpotlights.length; i++) { 
    arrayOfSpotlights[i] = new spotlight(); 
    arrayOfSpotlights[i].turnOn();   
} 

BTW,您应该使用TitleCase的类名。

你可以写你的类像这样,不使用像0神秘的代码和1

public class Spotlight { 
    private String state; 

    public Spotlight() { 
     turnOff(); 
    } 

    public void turnOn() { 
     state = "on"; 
    } 

    void turnOff() { 
     state = "off"; 
    } 

    public String toString() { 
     return "is " + state; 
    } 
} 
+0

谢谢 - 我会尝试这些方法没有神秘的代码也 – user2037935

+0

@ user2037935从前节省了几个字节重要,并使用0和1而不是打开和关闭是重要。例如在阿波罗11号任务中,他们试图着陆穿梭机时跑出内存。 ;) –

0

你声明的阵列arrayOfSpotlights,但没有初始化数组成员(所以他们null - 和你会得到例外)。

将其更改为:

public class Theatre { 
    spotlight[] arrayOfSpotlights; 

    public Theatre(int N){ 

     arrayOfSpotlights = new spotlight[N]; 

     for (int i = 0; i < arrayOfSpotlights.length; i++) { 
      arrayOfSpotlights[i]=new spotlight(); 
      arrayOfSpotlights[i].turnOn();   
     } 

    } 
} 

,它应该工作。