-1

私のプロジェクトには、接続する複数のクライアントを処理するサーバーがあります。クライアントが接続されるたびに、新しいスレッドでそのクライアントに固有の新しい「ギター」が作成されます。各「ギター」は 12 個のギター弦の配列であり、クライアント ウィンドウで弦に対応するキーが押されると、そのギターの弦が弾かれます。

Guitar クラスに notePlayed(char key) というメソッドがあり、弦を「はじき」、すべての「はじき」を結合されたオーディオに追加して再生します。ただし、呼び出されるたびにこのエラーが発生します。

key pressedj
Exception in thread "Thread-4" java.lang.NullPointerException
notePlayed accessed
at Guitar.notePlayed(Guitar.java:29)
at GuitarListener.run(GuitarServer.java:33)
at java.lang.Thread.run(Thread.java:680)

私のギターサーバーは次のようになります。

class GuitarListener implements Runnable {
private Socket sock;
private GuitarListenerGui gui;
private Guitar guitar;

public GuitarListener(Socket s, GuitarListenerGui g, Guitar gt) {
    this.sock = s;
    this.gui = g;
    this.guitar = gt;
}

public void run() {
    boolean loop=true;
    try {
        //setting up printwriters and bufferedreaders removed
        System.out.println("key pressed" + key);
        Guitar.notePlayed(key);
        }

さらに下の GuitarServer クラスで作成された新しい Guitar とスレッド

String keyboard ="qwertyuiop[]";
            GuitarString[] gStrings = new GuitarString[keyboard.length()];
            Guitar guitar = new Guitar(gStrings, keyboard);
            GuitarListener job = new GuitarListener(serverSocket.accept(), gui, guitar);

            // start a new thread to handle the connection
            Thread t = new Thread(job);
            t.start();

私のギタークラスは次のようになります。

public class Guitar {

private static String keyboard;;
private static GuitarString[] gStrings; 

public Guitar (GuitarString[] gStrings, String keyboard){
    this.keyboard=keyboard;
    this.gStrings=gStrings;
}

ここでエラーを引き起こす for ループを使用します。

    public static void notePlayed (char key){
  double sample=0.0;
               for (int i=0; i<keyboard.length(); i++){//adds all of the strings to sample to be played
                   sample+=gStrings[i].sample();        

投稿が長くなって申し訳ありませんが、誰かが私を正しい方向に向けるか、私がどれだけ離れているかを教えてもらえますか? 前もって感謝します。ご不明な点がございましたら、お気軽にお問い合わせください。

Guitar のメイン関数では、次のループでギターの弦を初期化します。

for(int i=0;i<keyboard.length();i++){
        double iNote = 440.0* Math.pow(2, i/12.0);//puts the correct frequency with each string
        System.out.println(iNote);
        gStrings[i] = new GuitarString(iNote);
    }   
4

1 に答える 1

1
 GuitarString[] gStrings = new GuitarString[keyboard.length()]; 

keyboard.length()値で初期化されたすべてのサイズを持つ GuitarString オブジェクトの配列になりnullます。行の for ループで使用する前に、配列内の各 GuitarString オブジェクトを初期化する必要があります。sample+=gStrings[i].sample();

于 2012-12-17T01:28:35.043 に答える