向ArrayList添加元素时出现NullPointerException

时间:2015-07-09 20:11:12

标签: java processing

我尝试使用以下方法将元素添加到名为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 ));

但是我收到了错误:&#34;意外的令牌:(&#34;在第<= p>行

activList.add(new Fiducial(3, 4.0, 5.0 ));

我没有得到它,我认为添加一个元素会阻止它为空但我仍然会收到错误。我该怎么修改呢?

感谢您的帮助

5 个答案:

答案 0 :(得分:8)

您实际上从未使用ArrayList实例化new。没有为ArrayList分配内存。

修复如下:

ArrayList<Fiducial> activList = new ArrayList<Fiducial>();

来自文档:

  

实例化:new关键字是一个创建对象的Java运算符。

     

初始化:新运算符后跟一个调用   构造函数,用于初始化新对象。

Creating Objects Documentation

只有原始类型(intdouble等)才会声明变量,因为你为它分配了内存。对象需要new关键字才能将内存与之关联。

答案 1 :(得分:4)

您必须初始化您的列表引用,如下所示:

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>();

它可以帮助您使代码更加弯曲

答案 2 :(得分:3)

只需使用 new 关键字进行实例化:

ArrayList<Fiducial> activList  = new ArrayList<Fiducial>();

或在java 7中,使用菱形运算符:

ArrayList<Fiducial> activList  = new ArrayList<>();

答案 3 :(得分:2)

此行自动将activList初始化为null,因此您需要对其进行实例化。

ArrayList<Fiducial> activList ;

你需要拥有它:

List<Fiducial> activList = new ArrayList<Fudicial>();

答案 4 :(得分:2)

添加其他两个答案:

您没有收到空指针错误,因为您的ArrayList为空。

你仍然可以引用一个空的arrayList。

如果你不能,你怎么能初始化arrayList并为它分配一个引用呢?

您收到空指针错误,因为您从未使用ArrayList<Fiducial>

实际初始化new ArrayList<Fiducial>();

因此引用为null,因为它实际上并没有引用任何ArrayList。