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;

を使用してProcessingメソッドでインスタンス化sendToHostしますsetup()

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

コードを実行すると、エラー メッセージが返されます

スレッド「アニメーション スレッド」での例外 java.lang.NullPointerException at sketch_gui.setup(sketch_gui.java:273) at processing.core.PApplet.handleDraw(PApplet.java:2117) at 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) ) com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:543) で jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:822) で jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:904) でprocessing.opengl.PGL.requestDraw (PGL.java:814) で 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回インスタンス化されているように見えるため、間違っているようです。

前もって感謝します。

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フィールドを作成し、外部からアクセスできるようにするためのパブリックアクセサーを提供する必要があります。privatepublic

于 2013-02-12T16:09:24.253 に答える
0

しかし、parameterList メンバーが 2 回インスタンス化されているように見えるため、間違っているようです。

配列を作成することと、配列にオブジェクトへの参照を設定することの違いを理解する必要があります。これ:

parameterList = new ParameterClass[sizeBuffer];

...最初はnull参照でいっぱいの配列を作成するだけです。要素を非 nullにしたい場合は、明示的に行う必要があります...これは、この行で行っていることです:

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

ただし、最初は配列を使用しないほうがよいかもしれません-なぜ配列が必要なのですか? で提供した方がよい可能性がありますList<ParameterClass>

(余談ですが、Java の命名規則について学び、それに従い、フィールドを非公開にする必要があります。)

于 2013-02-12T16:11:06.610 に答える