Java-嵌套类和数组-线程中的异常;“主要”;java.lang.NullPointerException
我是Java新手,正在实现一个包含嵌套类(CenterData)的类(CenterTable)。在封闭类中,我想创建CenterData类型的数组。代码如下所示: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
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];