我曾经在C中编写程序代码,现在转向Java,试图在下面的代码中定义一个简单的struct并创建它的数组,但是发生了运行时异常 线程“main”java.lang.NullPointerException中的异常 在CPoint.main(CPoint.java:19) 我知道我必须在某个地方为我的阵列分配内存,但不知道在哪里。任何帮助将不胜感激:
public class CPoint {
public int x;
public int y;
public CPoint(int size){
System.out.println("Constructor1 is called");
}
public CPoint(){
System.out.println("Constructor2 is called");
}
public static void main(String[] args){
CPoint [] p = new CPoint [3];
p[0].x=90;p[0].y=80; // this is line 19
System.out.println(p[0].x);
}
}
PS。我想在CPoint类中的某处分配内存,而不是在main中,如果可能的话,我想保持main()代码尽可能简单
答案 0 :(得分:2)
您需要分配数组中的每个对象:
public static void main(String[] args){
CPoint [] p = new CPoint [3];
p[0] = new CPoint();
p[0].x=90;p[0].y=80;
System.out.println(p[0].x);
}
编辑:您可以将数组初始化包装到类中的静态方法中 - 实质上是数组工厂方法:
public class CPoint {
public int x;
public int y;
public CPoint() { System.out.println("Inside constructor 1"); }
public static CPoint[] CPointSet(int size) {
CPoint[] p= new CPoint[size];
for(int i=0; i<size; i++)
p[i] = new CPoint();
return p;
}
public static void main(String[] args) {
CPoint[] p = CPoint.CPointSet(3);
p[0].x = 90;
p[0].y = 80;
}
}
答案 1 :(得分:1)
数组p
包含3个null
条目。初始化数组不会为您创建其中的对象。有关详细信息,请参阅Arrays。
答案 2 :(得分:0)
您需要在使用它们之前创建它们。
CPoint [] p = new CPoint [3];
p[0] = new CPoint();
答案 3 :(得分:0)
同意Moonbeam,新的CPoint [3]将创建一个Array对象,实际上一个引用数组(与C不同),并且所有三个元素都引用' null '最初。使用新的一些CPoint对象分配没有内存(对于CPoint结构)。
您可以用这种简洁的方式初始化数组:
CPoint[] p = { new CPoint(), new CPoint(), new CPoint() }
p[0].x=90; p[0].y=80;
System.out.println(p[0].x);