2010-02-27 3 views
2

Я бы очень признателен за помощь с моей программойИсключение в потоке java.lang.NullPointerException "поточно-4"

Exception in thread "Thread-4" java.lang.NullPointerException 
    at ServerConnect.replyChoice(BaseStaInstance.java:63) 
    at ServerConnect.run(BaseStaInstance.java:45) 
    at java.lang.Thread.run(Thread.java:619) 

моя функция ServerConnect выглядит следующим образом: -

class ServerConnect extends Thread { 

Socket skt; 
String sProcessId; 
ServerConnect scnt = null; 
ObjectOutputStream myOutput; 
ObjectInputStream myInput; 


ServerConnect(){} 
ServerConnect(Socket connection, String sProcessNo) { 
    this.skt = connection; 
    this.sProcessId = sProcessNo; 
} 

public void run() { 
    try { 
    myInput = new ObjectInputStream(skt.getInputStream()); 
    ServerConnect scnt = new ServerConnect(); 

    while(true) { 
    try{ 
    int ownTimeStamp = Global.iTimeStamp; 

    Object buf = myInput.readObject(); 

    //if we got input, print it out and write a message back to the remote client... 
    if(buf != null){ 
LINE 45-->  **scnt.replyChoice(buf);** 

    } 

    }catch(ClassNotFoundException e) { 
    e.printStackTrace(); 
    } 
    } 
    } catch(IOException e) { 
    e.printStackTrace(); 
    } 
} 

void replyChoice(Object buf){ 


    try{ 
LINE 63 --> **myOutput = new ObjectOutputStream(skt.getOutputStream());** 


    System.out.println("Server read:[ "+buf+" ]"); 
    myOutput.writeObject("got it"); 
    myOutput.flush(); 

    }catch(IOException e){ 
    e.printStackTrace(); 
    } 
} 
} 

Its в основном программирование сокетов и многопоточное приложение. Выполняя его на разных терминалах, чтобы клиент и сервер устанавливали соединения, я выполняю свой код. Но он поднимает ошибку выше на обоих терминалах. Это просто связано с тем, что я объявляю переменную myOutput не в том месте. Может ли кто-нибудь помочь мне. Из сообщения об ошибке я выделил строку 63 и строку 45 в прикрепленном фрагменте кода.

ответ

2

Ваш объект инициализируется первым конструктором, который не принимает параметров. В результате skt никогда не инициализируется и поэтому null. Когда вы вызываете skt.getOutputStream(), он выдает исключение с нулевым указателем, потому что он не может разыменовывать skt.

+0

thk u для ур help –

0
ServerConnect(){} 
ServerConnect(Socket connection, String sProcessNo) { 
    this.skt = connection; 
    this.sProcessId = sProcessNo; 
} 

какой конструктор вы используете? причиной санскр может быть неиницализированные

// Edit: О, я вижу теперь используется неправильный конструктор

ServerConnect scnt = new ServerConnect(); 

в

ServerConnect scnt = new ServerConnect(skt,sProcessId); 
+0

thk u для ур help –

4
  1. Капля конструктор
  2. по умолчанию сделать ваши поля экземпляра (stk и sProrcessId) final
  3. Посмотрите, как ваш компилятор жалуется и исправляет se issues

Эти инструкторы помогают вам торговать ошибками во время выполнения, такими как ваш NPE, для компиляции временных ошибок, что лучше всего делать. Примечание: Этот трюк предназначен для использования в целом.

+0

thk u для ur help –

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