Java-嵌套类和数组-线程中的异常;“主要”;java.lang.NullPointerException

Java-嵌套类和数组-线程中的异常;“主要”;java.lang.NullPointerException,java,nested-class,Java,Nested Class,我是Java新手,正在实现一个包含嵌套类(CenterData)的类(CenterTable)。在封闭类中,我想创建CenterData类型的数组。代码如下所示: public class CenterTable { public class CenterData { public int userId; public double distance; public double elevation; public int

我是Java新手,正在实现一个包含嵌套类(CenterData)的类(CenterTable)。在封闭类中,我想创建CenterData类型的数组。代码如下所示:

public class CenterTable {

public class CenterData {
        public int userId; 
        public double distance; 
        public double elevation; 
        public int point_00; 
        public int point_01; 
        public int point_10; 
        public int point_11; 

        public CenterData() {       
            userId = 0; 
            distance = 0; 
            elevation = 0; 
            point_00 = 0; 
            point_01 = 0; 
            point_10 = 0; 
            point_11 = 0; 
        }
    }   // end of CenterData class

public static CenterData[] centers = new CenterData[7064];  
public static double centerMaxDistance = 0; 
}
每当我尝试访问或设置阵列中心的元素时:

 CenterTable.centers[1].beam_user = 1; 
 System.out.println(CenterTable.centers[1].beam_user); 
我得到一个错误:线程“main”java.lang.NullPointerException中出现异常

如果我将类
CenterData
CenterTable
移到它自己的java类中,我不会遇到这样的问题。 我有点被困在这一点上,如果有任何人有任何建议/提示,那将是伟大的


提前感谢

您得到的是
NullPointerException
,因为您试图访问
center[1]
上的
beam\u user
,但它现在指的是
null

  • 创建数组时,所有值都是默认值
  • 引用类型的默认值为
    null
您需要首先创建对象

CentreTable.centers[1] = new CentreData();
用于创建所有对象

for(int i = 0; i<= centers.length ; i++){

    centers[i] = new CenterData();
}

所有元素都为空。您必须将
CenterData
实例放入数组中。

您已经创建了一个
CenterData
对象数组,但那只是一堆插槽,您可以将
CenterData
填入其中。您必须立即创建它们(使用
for
循环)或根据需要(通过检查
centers[i]==null
并在必要时创建一个新类)。

您能解释一下为什么我要将嵌套的CenterData类从CenterTable移动到它自己的java类中,我没有遇到这样的问题?
centers
包含7064个元素,所有元素都
null
您能向我解释一下,如果我将CenterData放入自己的java类中,而不是将其作为CenterTable中的嵌套类,那么问题就不会发生了吗?这个问题仍然会发生,与嵌套类无关。问题是,创建数组只会创建用于保存对一组对象的引用的插槽,而不会创建要进入数组内部的对象,并且除非您将对象分配给插槽,否则这些对象将
null
。啊,明白了。我只是想再多玩玩一下。似乎如果我将CenterData中的字段更改为静态,就不需要为每个数组元素创建实例。有什么原因吗?如果这样做,则字段属于类
CenterData
本身,而不是类的实例(副本)。这些变量只有一个拷贝,而不是七千个。您需要通读有关类和成员的基本Java教程。非常感谢您的快速回复!你为我清理了很多!我已经阅读了Oracle的java教程几个小时了,但没有太多时间坐下来仔细阅读,因为我只有非常有限的时间让这些代码正常工作。但我知道。当我有更多的时间时,我会坐下来学习。非常感谢。
centers[1].beam_user = 1;    
public static CenterData[] centers = new CenterData[7064];