0

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

// 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;

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

在 processing.core.PApplet.handleDraw(PApplet.java:2117) 在 processing.opengl.PGL$PGLListener.display(PGL .java:2472) 在 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)在 processing.opengl.PGL.requestDraw(PGL.java:814) 在 processing.core.opengl.PGraphicsOpenGL.requestDraw(PGraphicsOpenGL.java:1566)。PApplet.run(PApplet.java:2020) 在 java.lang.Thread.run(Thread.java:662)

那么我做错了什么?

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

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

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

提前致谢。

4

2 回答 2

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,并提供公共访问器以使它们可以从外部访问。

于 2013-02-12T16:09:24.253 回答
0

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

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

parameterList = new ParameterClass[sizeBuffer];

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

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

不过,您最好不要使用数组开始 - 为什么使用数组?您可能会更好地提供List<ParameterClass>.

(顺便说一句,您应该了解并遵循 Java 命名约定,并保持字段私有。)

于 2013-02-12T16:11:06.610 回答