2016-04-07 3 views
0

Я получаю исключение NullPointerException при запуске моего кода. Я сузил проблему до строки 38: когда она закомментирована, программа не дает никаких ошибок. Сейчас у меня есть «тест».java.lang.NullPointerException PrintWriter

out.println("test") 

Метод запуска сразу же начинается с двух следующих строк в другом классе

Client test = new Client(); 
test.start(); 

И когда кнопка нажата выполняется следующий код, который запускает метод sendToServer

Client test = new Client(); 
test.sendToServer(cipherText) 

Ниже приведен полный код для моего класса Client.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class Client extends Thread{ 

    String line = ""; 
    String cipherText = ""; 

    BufferedReader in; 
    PrintWriter out; 

    public void run(){ 
      String serverAddress = "00.000.000.000"; 
     try{ 
      Socket socket = new Socket(serverAddress, 8888); 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      out = new PrintWriter(socket.getOutputStream(), true); 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 
     while (true) { 
      try{ 
       line = in.readLine(); 
      } 
      catch(IOException e){ 
       e.printStackTrace(); 
      } 
      System.out.println(line); 
     } 
    } 

    public void sendToServer(String in) { 
     out.println("test"); 
    } 

} 

Спасибо за то, что я все еще изучаю Java, поэтому оправдываю любые очевидные ошибки.

+0

Вам необходимо установить соединение с сервером - сокет должен быть хорошо установлен - прежде чем вы сможете читать и записывать потоки, связанные с сокетом. – laune

ответ

0

Это потому, что вы использовали PrintWriter out; как ваш член класса, но вы его не инициализировали. По умолчанию все неинициализированные объекты-члены инициализируются null. Если sendToServer() называется первым, out будет null, и вы получите NullPointerException.

EDIT

Проблема заключается в том, что вы пытаетесь вызвать run() и sendToServer() методы в двух отдельных случаях Client.

Client test = new Client(); // First instance 
test.start();    // which calls run() and then initializes out variable. 

Затем второй экземпляр создается из:

Client test = new Client(); // Second instance 
test.sendToServer(cipherText); // since out is not initialized for this instance, you are getting NPE 

Я полагаю, вы используете Client объект в многопоточной среде, в этом случае я хотел бы предложить вам, чтобы убедиться, что обе нити используя тот же экземпляр объекта Client. Кроме того, если общий экземпляр Client, вы можете сделать доступным к переменной out переменной синхронизации, а также убедитесь, что метод запуска Client выполняется до нажатия кнопки (что в свою очередь вызывает sendToServer()).

+0

Я использовал 'test.start();' для вызова 'run();' который я могу подтвердить, общается с моей серверной программой до вызова sendToServer. Вы можете видеть это во втором снайпере кода, который я дал в моем первоначальном вопросе. – xianate

+0

А, ладно, проблема в том, что вы вызываете 'sendToServer()' и 'run()' метод в двух отдельных экземплярах 'Client'. –

+0

Я немного изменил свой код и могу подтвердить, что проблема заключается в том, что оба они работают в двух отдельных экземплярах. Огромное спасибо. – xianate

1

Вы в самом начале класса:

PrintWriter out; 

, если вы не вызываете Run() [где вы инициализировать его] до sendToServer(), «из» никогда не будет инициализированы и будете быть нулевым.

+0

Дозу второго кода snipet i showcased не запускается()? – xianate

0
Your function assumes out Printwriter will be initialized, but if there is an exception in the socket initialization, it will never by initialized. Two things I would do... 

1. Initialize out to null at the top of the run method. 

2. protect your sendToServer code... 

public void sendToServer(String in) throws NullPointerException 
{ 
    if (out == null) 
    { 
      throw new NullPointerException("Out is null."); 
    } 
    out.println("test"); 
} 
+0

Спасибо, я внедрил это и могу подтвердить, что выход не инициализируется. – xianate

+0

user987339 определил корень проблемы ... ваш адрес сервера равен нулю. Для простого тестирования обратный адрес цикла «127.0.0.1» является хорошей идеей. –

+0

Адрес сервера не является проблемой, он работал с моим общедоступным адресом, который я решил не разделить. при добавлении правильного адреса моя серверная программа подтверждает соединение. – xianate