2014-01-07 5 views
2

Попытка отправить массивList через сокет, получить исключение нулевого указателя при инициализации потока ввода объекта (клиент).NullPointerException при получении списка массивов по сокету

Клиент:

try { 
     ObjectInputStream objIn = new ObjectInputStream(
       Client.socket.getInputStream()); // HERE 
     library = (ArrayList<Book>) objIn.readObject(); 
    } catch (IOException e) { 

Сервер:

try { 
    ObjectOutputStream objOut = new ObjectOutputStream(
      this.client.getOutputStream()); 
    objOut.writeObject(library); 
    objOut.flush(); // added later, not helping 
} 

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

EDIT

public class Client { 

    private static int port = 6666; 
    private static Socket socket = null; 

    public Client (int port) { 
     Client.port = port; 
    } 

    public Client() { 
    } 

    public void establishConnection() { 
     try { 
      Client.socket = new Socket(InetAddress.getByName(null), Client.port); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

Сервер:

public void start() { 
    (new Thread() { 
     public void run() { 
      try { 
       Server.socket = new ServerSocket(Server.portNumber); 
       while (!Server.stop) { 
        Socket client = Server.socket.accept(); 
        (new HandleRequest (client)).start(); 
       } 
      ............... 


public class HandleRequest extends Thread { 

    private Socket client = null; 
    private SQL sql_db = new SQL(); 

    public HandleRequest (Socket client) { 
     this.client = client; 
    } 

    @Override 
    public void run() { 
     try { 
      if (!this.sql_db.isConnected()) 
       this.sql_db.connect(); 
      if (this.client == null) { 
       System.out.println("Error: client does not exist, NO idea what's going on"); 
       return; 
      } 



      ArrayList<Book> library = this.sql_db.getAllBooks(); 
      try { 
       ObjectOutputStream objOut = new ObjectOutputStream(
         this.client.getOutputStream()); 
       objOut.writeObject(library); 
       objOut.flush(); 
      } catch (Exception e) { 
       System.out.println("Server error in handling request for whole library!"); 
       e.printStackTrace(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+1

Недостаточно кода в этом вопросе, чтобы дать вам ответ. Пожалуйста, покажите нам, где 'Client.socket' определяется и создается экземпляр. Желательно опубликовать [SSCCE] (http://sscce.org), который демонстрирует проблему. –

+2

Можете ли вы предоставить трассировку стека и показать номер строки, на которую он жаловался? Это обычно очень полезно в этих ситуациях. – CodeChimp

+0

@ Duncan Ok попробует. @CodeChimp, трассировка стека указывает на '// здесь' в моем коде – Kalec

ответ

2

Поскольку NPE находится на этой линии:

Client.socket.getInputStream()); 

есть только одна вещь, которая может вызвать его. Это не может быть Client, потому что это static. Это не может быть getInputStream(), потому что это метод, поэтому он должен быть socket, который вызывает NPE.

На этой линии:

private static Socket socket = null; 

установить socket быть null. Единственное место, где я вижу, где вы указываете, что оно не равно null, находится в вашем методе .establishConnection(), но я не вижу, где вы называете этот метод.

Таким образом, ваша проблема, скорее всего, вы не вызываете метод .establishConnection().

2

ли вы establishConnection метод вызывается перед

try { 
    ObjectInputStream objIn = new ObjectInputStream(
      Client.socket.getInputStream()); // HERE 
    library = (ArrayList<Book>) objIn.readObject(); 
} catch (IOException e) { 

Если нет, то ваш Client.socket является недействительным и вы должны инициализировать Это. То есть Ваш код должен выглядеть следующим образом:

try { 
    Client c = new Client(1337); 
    c.establishConnection(); 
    ObjectInputStream objIn = new ObjectInputStream(
      c.socket.getInputStream()); // HERE 
    library = (ArrayList<Book>) objIn.readObject(); 
} catch (IOException e) { 
+0

Действительно. Когда я начал перемещать вещи, я забыл называть '.establishConnection' – Kalec

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