2012-12-17 2 views
-1

В моем проекте у меня есть сервер, который обрабатывает несколько клиентов, которые подключаются к нему. Каждый раз, когда клиент подключается, создается новая «Гитара», специфичная для этого клиента в новом потоке. Каждая «гитара» представляет собой массив из 12 гитарных струн, и когда в окне клиента нажата клавиша, соответствующая строке, эта строка гитары выщипывается.Многопоточный сервер/новый объект на каждом потоке

У меня есть метод под названием notePlayed (char key) в моем классе Guitar, который «сжимает» строку и добавляет все «сгибы» в комбинированный звук для воспроизведения. Тем не менее, я бегу в эту ошибку в любое время он называется:

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

и мой класс Guitar выглядит следующим образом:

public class Guitar { 

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

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

с для цикла вызывает здесь ошибка:

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, перейдите к своим точкам останова и добавьте точку останова для Null Pointer Exception, чтобы лучше понять, в чем проблема. Похоже, что с некоторой хорошей отладкой вы должны это понять. –

+0

У вас есть исключение NullPointerException, и оно говорит вам где. Вы пытаетесь использовать то, что является «нулевым». Это отличная возможность ознакомиться с отладчиком. –

+0

Спасибо, я никогда не был знаком с инструментом отладки, но я обязательно попытаюсь поиграть с ним. – Nolan

ответ

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

приведет массив GuitarString объектов с размером keyboard.length() все инициализирован с null значением. Вы должны инициализировать каждый объект GuitarString в массиве, прежде чем использовать его в цикле for в строке sample+=gStrings[i].sample();

+0

Спасибо за помощь clinton, мне пришлось инициализировать gStrings в конструкторе, а не в основном – Nolan

Смежные вопросы