是什么导致此java.lang.NullPointerException错误?

是什么导致此java.lang.NullPointerException错误?,java,nullpointerexception,Java,Nullpointerexception,我对Java是相当陌生的,我已经浏览了整个互联网和stackoverflow本身,以了解我做错了什么,但没有运气。有人能告诉我为什么我会犯这个错误吗?我认为我已经以正确的方式初始化了数组,并且我认为我也正确地实例化了它 public class Grid { private Slot[][] array = new Slot[12][12]; public Grid(){}; public void printarray(){ for(int i = 1 ; i &

我对Java是相当陌生的,我已经浏览了整个互联网和stackoverflow本身,以了解我做错了什么,但没有运气。有人能告诉我为什么我会犯这个错误吗?我认为我已经以正确的方式初始化了数组,并且我认为我也正确地实例化了它

public class Grid {

 private Slot[][] array = new Slot[12][12];

 public Grid(){};


 public void printarray(){   

    for(int i = 1 ; i <= 10 ; i++){
        System.out.print(i + "|" + "");
        for(int j = 1 ; j <= 10 ; j++){     

            System.out.print(array[i][j].getStatus());

        }//end inner for        

        System.out.print("\n");
    }//end outer for 
    System.out.print("\n");

};

}//end of class




public class Slot {


    public Slot(){};


    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }


    public int getId() {
        return id;
    }


    public void setId(int id) {
        this.id = id;
    }


    private int status = 0 ;
    private int id = 0 ;

}//end of slot

public static void main(String[] args) {
    Grid myGrid = new Grid();
    myGrid.printarray();
}//end of main
公共类网格{
专用插槽[][]阵列=新插槽[12][12];
公共网格(){};
public void printary(){

对于(int i=1;i您已经正确初始化了数组,但它仍然是空的。您需要创建
Slot
类型的对象并填充数组,然后才能拉出对象并对其调用方法

System.out.print(array[i][j].getStatus());

该行试图从数组的位置i,j中拉出一个
插槽
,但那里什么都没有,因此它返回
null
。调用
getStatus()
null
引用上导致异常。

问题是数组在每个位置都用null初始化。如果不希望值为null,则应在构造函数中用值初始化它。此外,在print语句中,您没有打印所有元素,只打印前10个元素十排

由于您在全局级别声明了它:

private Slot[][] array = new Slot[12][12];
每个位置
数组[number][number]
的初始值都将为null。您可以在构造函数中进行初始化,如下所示:

public Grid(){
   for(int i = 0 ; i < 12 ; i++){
       for(int j = 0 ; j < 12 ; j++){
           array[i][j] = new Slot(0, 0);
       }
   }
}

public Slot(int id, int status){
     this.id = id;
     this.status = status;
}
公共网格(){
对于(int i=0;i<12;i++){
对于(int j=0;j<12;j++){
数组[i][j]=新时隙(0,0);
}
}
}
公共插槽(int id,int状态){
this.id=id;
这个状态=状态;
}

哪一行抛出NPE?我猜是
System.out.print(数组[i][j].getStatus());
。您创建了一个数组,但从未将任何内容放入其中。
private Slot[][]array=new Slot[12][12];
不会自动将插槽放入其中。System.out.print(数组[i][j].getStatus());是抛出NPEYou需要的类似于
array[0][0]=new Slot()的NPEYou的东西在C++中,我做了同样的事情,网格构造函数调用每个时隙的构造函数,这样就不需要手工创建它们,java是否处理不同的情况?如果你想要一个12x12的时隙对象数组,那么你需要Cre。ate 144个插槽对象。@Lucawuz是的,您需要一个循环或其他代码来创建这些对象并将它们添加到数组中。
Java中的新插槽[12][12]
只为您创建空数组。哦,我明白了,谢谢。所以新插槽[12][12]不调用插槽构造函数?@Lucawuz不,它只创建数组。它不调用
Slot
构造函数。对于我希望它做的打印部分,我不明白为什么我的元素没有初始化,网格构造函数不应该自己调用插槽构造函数144次吗?@Lucawuz不,你必须初始化eac数组的h元素,如上图所示,我为Grid类发布了一个构造函数示例。@Lucawuz我给了您一个示例,说明了这两个构造函数的外观。