在Processing中实例化变量异常

时间:2013-02-12 16:06:54

标签: java constructor processing

我正在尝试为类创建一个构造函数

// Variables to send to Host
private class ParameterClass {
  public String parameter;
  public int value;
  public Boolean sended;
}

public class SendToHostClass {
  private int sizeBuffer;
  public ParameterClass[] parameterList;

  SendToHostClass(int sizeBufferConf) {
    sizeBuffer = sizeBufferConf;
    parameterList = new ParameterClass[sizeBuffer];
  }

  public void Put (String parameter, int valuePut, Boolean sendedPut) {
    for (int index=0; index<sizeBuffer; index++) {
      if (parameter == parameterList[index].parameter) {
        parameterList[index].value = valuePut;
        parameterList[index].sended = sendedPut;
        exit();
      }
    }
  }
}

所以我宣布了变量

SendToHostClass sendToHost;

并使用

sendToHost处理方法中实例化setup()
sendToHost = new SendToHostClass(10);
sendToHost.parameterList[0].value = 0;

当我运行代码时,它会返回错误消息

  

线程“动画线程”中的异常java.lang.NullPointerException     在sketch_gui.setup(sketch_gui.java:273)at   processing.core.PApplet.handleDraw(PApplet.java:2117)at   processing.opengl.PGL $ PGLListener.display(PGL.java:2472)at   jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:548)     在jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:533)     在   jogamp.opengl.GLAutoDrawableBase $ 2.run(GLAutoDrawableBase.java:280)     在   jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:904)     在jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:822)     在com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:543)at   processing.opengl.PGL.requestDraw(PGL.java:814)at   processing.opengl.PGraphicsOpenGL.requestDraw(PGraphicsOpenGL.java:1566)     在processing.core.PApplet.run(PApplet.java:2020)at   java.lang.Thread.run(Thread.java:662)

那么我做错了什么?

我还发现如果我单独实例化每个列表对象,它就不会出错:

sendToHost = new SendToHostClass(10);
sendToHost.parameterList[0] = new ParameterClass();
sendToHost.parameterList[0].value = 0;

但似乎错了,因为看起来parameterList成员被实例化了两次。

提前致谢。

2 个答案:

答案 0 :(得分:2)

parameterList = new ParameterClass[sizeBuffer];

以上语句仅创建数组,但不初始化数组元素。如果您拥有某些null的数组或某些引用,则数组元素将按其默认值(custom type进行初始化。因此,您需要使用for循环分别初始化数组元素。

因此,在构造函数中,您需要添加一个循环:

SendToHostClass(int sizeBufferConf) {
    sizeBuffer = sizeBufferConf;
    parameterList = new ParameterClass[sizeBuffer];

    for (int i = 0; i < sizeBuffer; i++) {
        parameterList[i] = new ParameterList();
    }
  }

但是,当然,首先您需要制作课程public,并希望将字段设为private而不是public,并提供公共访问者以使其可以从外部访问。

答案 1 :(得分:0)

  

但似乎错了,因为它看起来是参数列表成员被实例化两次。

您需要了解创建数组和使用对象引用填充数组之间的区别。这样:

parameterList = new ParameterClass[sizeBuffer];

... 只是创建一个最初充满空引用的数组。如果你想让元素非null ,你必须明确地这样做......这就是你在这一行中所做的:

sendToHost.parameterList[0] = new ParameterClass();

你可能最好不要使用数组开始 - 为什么你想要一个数组?使用List<ParameterClass>可能会提供更好的报价。

(另外,您应该了解并遵循Java命名约定,并将字段保密。)