向 ArrayList 添加元素时出现 NullPointerException
NullPointerException when adding elements to ArrayList
我正在尝试使用以下方法将元素添加到名为 activList 的 ArrayList:
activList.add(new Fiducial(iD, x, y ));
但是当 运行 代码:
时,我在这一行得到一个 NullPointerException
int cols = 10, rows = 10;
int rectangleWidth = 100;
int rectangleHeight = 60;
// these are some helper variables which are used
// to create scalable graphical feedback
int k, l, iD;
float cursor_size = 15;
float object_size = 60;
float table_size = 760;
float scale_factor = 1;
float x, y;
ArrayList<Fiducial> activList ;
public class Fiducial {
public int iD;
public float x;
public float y;
public Fiducial(int iD, float x, float y) {
this.iD = iD;
this.x = x;
this.y = y;
}
}
void draw() {
// Begin loop for columns
for ( k = 0; k < cols; k++) {
// Begin loop for rows
for ( l = 0; l < rows; l++) {
fill(255);
stroke(0);
rect(k*rectangleWidth, l*rectangleHeight, rectangleWidth, rectangleHeight);
}
}
// This part detects the fiducial markers
float obj_size = object_size*scale_factor;
float cur_size = cursor_size*scale_factor;
ArrayList<TuioObject> tuioObjectList = tuioClient.getTuioObjectList();
for (int i=0; i<tuioObjectList.size (); i++) {
TuioObject tobj= tuioObjectList.get(i);
stroke(0);
fill(0, 0, 0);
pushMatrix();
translate(tobj.getScreenX(width), tobj.getScreenY(height));
rotate(tobj.getAngle());
rect(-80, -40, 80, 40);
popMatrix();
fill(255);
x = round(10*tobj.getX ());
y = round(10*tobj.getY ());
iD = tobj.getSymbolID();
activList.add(new Fiducial(iD, x, y ));
fiducialCoordinates ();
}
}
void fiducialCoordinates () {
System.out.println("x= "+ x + " y= " + y + " iD= " + iD );
System.out.println(activList);
}
我确实阅读了此页面:What is a NullPointerException, and how do I fix it?(所以请不要将其报告为重复)
据我了解,我收到错误是因为我的 ArrayList 没有任何元素。但是,我尝试在创建后立即添加一个,如下所示:
ArrayList<Fiducial> activList ;
activList.add(new Fiducial(3, 4.0, 5.0 ));
但我收到错误:"unexpected token: ( " 在行:
activList.add(new Fiducial(3, 4.0, 5.0 ));
我不明白,我以为添加一个元素可以防止它为 Null,但我仍然收到错误消息。我应该如何修改这个?
感谢您的帮助
您实际上从未使用 new
实例化 ArrayList
。没有为 ArrayList
.
分配内存
像这样修复它:
ArrayList<Fiducial> activList = new ArrayList<Fiducial>();
来自文档:
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a
constructor, which initializes the new object.
Creating Objects Documentation
只有基本类型(int
、double
等)才会在为变量分配内存时声明变量。对象需要 new
关键字来关联内存。
您必须初始化列表的引用,如下所示:
ArrayList<Fiducial> activList = new ArrayList<Fiducial>();
activList.add(new Fiducial(3, 4.0, 5.0 ));
您表示引用 activList
将指定给堆内存中的 ArrayList
对象。您可以尝试其他方式初始化:
// List -> use ArrayList or LinkedList
List<Fiducial> activList = new ArrayList<Fiducial>();
// Collection -> use List, Set or Queue realizations
Collection<Fiducial> activList = new ArrayList<Fiducial>();
它将帮助您使您的代码更加弯曲。
这一行自动将active List初始化为null,所以需要实例化。
ArrayList<Fiducial> activList ;
你需要让它成为:
List<Fiducial> activList = new ArrayList<Fudicial>();
补充另外两个答案:
您没有收到空指针错误,因为您的 ArrayList 是空的。
您仍然可以引用空数组列表。
如果不能,您还能如何初始化 arrayList 并为其分配引用?
您收到空指针错误是因为您实际上从未使用 new ArrayList<Fiducial>();
初始化 ArrayList<Fiducial>
因此引用为空,因为它实际上并未引用任何 ArrayList。
只需使用 new 关键字实例化即可:
ArrayList<Fiducial> activList = new ArrayList<Fiducial>();
或者在java7中,使用菱形运算符:
ArrayList<Fiducial> activList = new ArrayList<>();
我正在尝试使用以下方法将元素添加到名为 activList 的 ArrayList:
activList.add(new Fiducial(iD, x, y ));
但是当 运行 代码:
时,我在这一行得到一个 NullPointerExceptionint cols = 10, rows = 10;
int rectangleWidth = 100;
int rectangleHeight = 60;
// these are some helper variables which are used
// to create scalable graphical feedback
int k, l, iD;
float cursor_size = 15;
float object_size = 60;
float table_size = 760;
float scale_factor = 1;
float x, y;
ArrayList<Fiducial> activList ;
public class Fiducial {
public int iD;
public float x;
public float y;
public Fiducial(int iD, float x, float y) {
this.iD = iD;
this.x = x;
this.y = y;
}
}
void draw() {
// Begin loop for columns
for ( k = 0; k < cols; k++) {
// Begin loop for rows
for ( l = 0; l < rows; l++) {
fill(255);
stroke(0);
rect(k*rectangleWidth, l*rectangleHeight, rectangleWidth, rectangleHeight);
}
}
// This part detects the fiducial markers
float obj_size = object_size*scale_factor;
float cur_size = cursor_size*scale_factor;
ArrayList<TuioObject> tuioObjectList = tuioClient.getTuioObjectList();
for (int i=0; i<tuioObjectList.size (); i++) {
TuioObject tobj= tuioObjectList.get(i);
stroke(0);
fill(0, 0, 0);
pushMatrix();
translate(tobj.getScreenX(width), tobj.getScreenY(height));
rotate(tobj.getAngle());
rect(-80, -40, 80, 40);
popMatrix();
fill(255);
x = round(10*tobj.getX ());
y = round(10*tobj.getY ());
iD = tobj.getSymbolID();
activList.add(new Fiducial(iD, x, y ));
fiducialCoordinates ();
}
}
void fiducialCoordinates () {
System.out.println("x= "+ x + " y= " + y + " iD= " + iD );
System.out.println(activList);
}
我确实阅读了此页面:What is a NullPointerException, and how do I fix it?(所以请不要将其报告为重复)
据我了解,我收到错误是因为我的 ArrayList 没有任何元素。但是,我尝试在创建后立即添加一个,如下所示:
ArrayList<Fiducial> activList ;
activList.add(new Fiducial(3, 4.0, 5.0 ));
但我收到错误:"unexpected token: ( " 在行:
activList.add(new Fiducial(3, 4.0, 5.0 ));
我不明白,我以为添加一个元素可以防止它为 Null,但我仍然收到错误消息。我应该如何修改这个?
感谢您的帮助
您实际上从未使用 new
实例化 ArrayList
。没有为 ArrayList
.
像这样修复它:
ArrayList<Fiducial> activList = new ArrayList<Fiducial>();
来自文档:
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a constructor, which initializes the new object.
Creating Objects Documentation
只有基本类型(int
、double
等)才会在为变量分配内存时声明变量。对象需要 new
关键字来关联内存。
您必须初始化列表的引用,如下所示:
ArrayList<Fiducial> activList = new ArrayList<Fiducial>();
activList.add(new Fiducial(3, 4.0, 5.0 ));
您表示引用 activList
将指定给堆内存中的 ArrayList
对象。您可以尝试其他方式初始化:
// List -> use ArrayList or LinkedList
List<Fiducial> activList = new ArrayList<Fiducial>();
// Collection -> use List, Set or Queue realizations
Collection<Fiducial> activList = new ArrayList<Fiducial>();
它将帮助您使您的代码更加弯曲。
这一行自动将active List初始化为null,所以需要实例化。
ArrayList<Fiducial> activList ;
你需要让它成为:
List<Fiducial> activList = new ArrayList<Fudicial>();
补充另外两个答案:
您没有收到空指针错误,因为您的 ArrayList 是空的。
您仍然可以引用空数组列表。
如果不能,您还能如何初始化 arrayList 并为其分配引用?
您收到空指针错误是因为您实际上从未使用 new ArrayList<Fiducial>();
ArrayList<Fiducial>
因此引用为空,因为它实际上并未引用任何 ArrayList。
只需使用 new 关键字实例化即可:
ArrayList<Fiducial> activList = new ArrayList<Fiducial>();
或者在java7中,使用菱形运算符:
ArrayList<Fiducial> activList = new ArrayList<>();