В моем проекте у меня есть сервер, который обрабатывает несколько клиентов, которые подключаются к нему. Каждый раз, когда клиент подключается, создается новая «Гитара», специфичная для этого клиента в новом потоке. Каждая «гитара» представляет собой массив из 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);
}
Какая IDE вы используете? Если вы используете Eclipse, перейдите к своим точкам останова и добавьте точку останова для Null Pointer Exception, чтобы лучше понять, в чем проблема. Похоже, что с некоторой хорошей отладкой вы должны это понять. –
У вас есть исключение NullPointerException, и оно говорит вам где. Вы пытаетесь использовать то, что является «нулевым». Это отличная возможность ознакомиться с отладчиком. –
Спасибо, я никогда не был знаком с инструментом отладки, но я обязательно попытаюсь поиграть с ним. – Nolan