我正在尝试为类创建一个构造函数
// 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
成员被实例化了两次。
提前致谢。
答案 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命名约定,并将字段保密。)