私のプロジェクトには、接続する複数のクライアントを処理するサーバーがあります。クライアントが接続されるたびに、新しいスレッドでそのクライアントに固有の新しい「ギター」が作成されます。各「ギター」は 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);
}