【问题标题】:Null pointer exception for Array of Objects对象数组的空指针异常
【发布时间】:2013-01-18 13:58:10
【问题描述】:

我不熟悉使用对象数组,但无法弄清楚我做错了什么以及为什么我不断收到 Null 指针异常。我正在尝试使用一组设置为打开或关闭的聚光灯对象创建一个剧院类。但是 - 每当我调用这个数组时,我都会得到一个空指针异常。

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;

}
}

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

【问题讨论】:

  • 数组用空值初始化。您需要为数组的每个条目分配一个新的聚光灯,如下所示:array[2] = new Spotlight()。旁注:按照约定(不是语法)的类名应该以大写字母开头。
  • 将你的数组包私有化是有风险的,即使数组是最终的,仍然可以更改引用。包 private 比 public 更好,但你仍然需要特别注意,当你不希望它们发生变化时,事情不会发生变化。
  • (我不得不提一下,忽略编码约定是一个非常糟糕的主意。)

标签: java arrays nullpointerexception


【解决方案1】:

当您执行“arrayOfSpotlights = new Spotlight[N];”时你初始化一个长度为 N 的数组,你还需要初始化其中的每个对象:

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

希望我是对的:)

【讨论】:

  • arrayOfSpotlights[i] = 新聚光灯();哇非常感谢大家 - 正是 for 循环中的这一行丢失了,现在整个程序(更长!)工作 - 再次感谢
【解决方案2】:

替换

arrayOfSpotlights[i].turnOn();

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

线

arrayOfSpotlights =  new spotlight[N];

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

【讨论】:

    【解决方案3】:

    您没有创建聚光灯对象。

    arrayOfSpotlights =  new spotlight[N];
    

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

    简单的解决办法是

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

    顺便说一句,您应该使用 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;
        }
    }
    

    【讨论】:

    • 谢谢 - 我也会尝试这些方法,不用密码
    • @user2037935 曾几何时,节省几个字节很重要,使用 0 和 1 代替 on 和 off 很重要。例如在阿波罗 11 号任务中,他们在试图降落航天飞机时内存不足。 ;)
    【解决方案4】:

    您声明了数组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();          
            }
    
        } 
    }
    

    它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 2011-08-07
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      相关资源
      最近更新 更多