Исключение в потоке "thread-4" java.lang.NullPointerException - PullRequest
2 голосов
/ 27 февраля 2010

Я бы очень признателен за помощь с моей программой

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

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

Ответы [ 3 ]

4 голосов
/ 27 февраля 2010
  1. Удалить конструктор по умолчанию
  2. Сделайте ваши поля экземпляра (stk и sProrcessId) окончательными
  3. Посмотрите, как ваш компилятор жалуется и исправьте эти проблемы

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

2 голосов
/ 27 февраля 2010

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

0 голосов
/ 27 февраля 2010
 ServerConnect(){}
 ServerConnect(Socket connection, String sProcessNo) {
  this.skt = connection;
  this.sProcessId = sProcessNo;
 }

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

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

   ServerConnect scnt = new ServerConnect();

до

   ServerConnect scnt = new ServerConnect(skt,sProcessId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...