当前位置: 首页 > 知识库问答 >
问题:

向ArrayList添加元素时出现NullPointerException

上官羽
2023-03-14

我正在尝试使用以下方法将元素添加到名为activList的ArrayList中:

activList.add(new Fiducial(iD, x, y ));

但是我在运行代码时在这一行得到了一个NullPointerExcema:

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

我确实读过这一页:什么是NullPointerException,如何修复它?(请不要重复报告)

我所理解的是,我得到错误是因为我的ArrayList没有任何元素。但是,我尝试在创建后立即添加一个,如下所示:

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

但我得到了一个错误:“意外标记:(”在第行:

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

我不明白,我以为添加一个元素可以防止它为Null,但我仍然得到一个错误。我应该如何修改它?

多谢你的帮忙

共有3个答案

麹耘豪
2023-03-14

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

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

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

ArrayList<Fiducial> activList  = new ArrayList<>();
郏博瀚
2023-03-14

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

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

它将帮助您使代码更加弯曲。

黄兴业
2023-03-14

您从未使用new实际实例化ArrayList。尚未为阵列列表分配内存。

像这样修复它:

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

从文档中:

实例化:new关键字是创建对象的Java操作符

初始化:新运算符后面跟着对构造函数的调用,构造函数初始化新对象。

创建对象文档

只有使用基元类型(int等)才会像为其分配内存那样声明变量。对象需要new关键字才能拥有与其关联的内存。

 类似资料:
  • 任何洞察力都值得赞赏。多谢了。 ScreenBase.cpp:

  • 问题内容: 我是Groovy的新手,尽管阅读了许多有关此的文章和问题,但我仍然不清楚发生了什么。到目前为止,据我了解,当您在Groovy中创建新数组时,底层类型是Java ArrayList。这意味着它应该可调整大小,您应该能够将其初始化为空,然后通过add方法动态添加元素,如下所示: 编译,但是在运行时失败:方法的无签名:[LMyType; .add()适用于参数类型:(MyType)值:[My

  • 问题内容: 我以为链表在添加元素时应该比数组表快?我只是测试了添加,排序和搜索元素(数组列表,链表,哈希集)需要多长时间。我只是对数组列表和链接列表使用java.util类…使用每个类都可以使用的两个add(object)方法。 arraylist在填充列表中执行链表…并在列表中进行线性搜索。 这是正确的吗?我在执行中做错了吗? *_ __ _ _ __ _编辑 __ * __ __ * * 我只

  • 对于字符串"a3tx2z",这个的输出应该是"attttxzzz",或者对于"12x",应该是"2xxx"。我检查了所有的东西,它们都有效。但是当我想打印"ttt"代替3时,在第28行有一个l.add(i, s1);。这里有什么问题?

  • 问题内容: 我有这个android代码,它从服务器中获取一个JSON并从该JSON填充一个ArrayList,我在onresponse空隙内检查了ArrayList“ meals”的大小,它给了我1,但是当我在StringRequest对象后对其进行检查时,我得到了0个项目。进餐在全局范围内定义,并在oncreateview函数内部进行初始化代码: 问题答案: 这里的问题是关于了解任务如何工作的。