2012-12-17 56 views
-1

在我的項目中,我有一個處理連接到它的多個客戶端的服務器。每次連接客戶端時,都會創建一個新的「Guitar」,該客戶端在新線程上特定於該「Guitar」。每個「吉他」是12個吉他弦的數組,當在客戶窗口中按下與一個弦相對應的鍵時,該吉他的弦被拔出。多線程服務器/每個線程上的新對象

我在我的吉他類中有一個名爲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) 

我guitarserver看起來是這樣的:

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類進一步下跌

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();   

很抱歉後的長度,但任何人可以點我在正確的方向還是讓我知道我是多麼遙遠?提前致謝。我很高興回答您可能遇到的任何問題。

在吉他的主要功能我初始化guitarstrings與此循環:

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); 
    } 
+1

您正在使用哪種IDE?如果您正在使用Eclipse,請轉至您的斷點併爲「空指針異常」添加一個斷點,以便您更好地瞭解問題所在。似乎有一些很好的調試,你應該能夠弄清楚這一點。 –

+0

你有一個NullPointerException,它告訴你在哪裏。你正試圖使用​​'null'的東西。這是熟悉調試器的絕佳機會。 –

+0

謝謝,我從來沒有真正被引入調試工具,但我一定會嘗試和玩弄它。 – Nolan

回答

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

將導致具有的keyboard.length()大小所有null值初始化GuitarString對象的數組。您必須初始化陣列中的每個GuitarString對象,然後才能在該行的for循環中使用它sample+=gStrings[i].sample();

+0

感謝克林頓的幫助,我不得不在構造函數中初始化gStrings,而不是在main – Nolan