2014-01-07 2 views
2

소켓을 통해 arrayList를 보내려고하면 객체 입력 스트림 초기화 (클라이언트)에서 null 포인터 예외가 발생합니다.소켓을 통해 배열 목록을받을 때 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 
} 

나는 거의 성공을 지금 이틀 동안 소켓을 통해 comunicate 수하기 위해 노력했습니다. 나는 무슨 일이 벌어지고 있는지 전혀 모른다. 내가 더 많은 시간을 가질 때 자신을 더 잘 문서화 할 계획이지만, 현재 무슨 일이 일어나고 있는지 이해하고 싶습니다.

편집

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

. 그것은 static이기 때문에 Client 일 수 없습니다. 그것은 getInputStream() 일 수 없으므로 그 방법이므로 NPE를 일으키는 socket이어야합니다. 이 라인에

는 : null을 할

private static Socket socket = null; 

당신은 socket을 설정합니다. 내가 null이 아닌 것으로 설정 한 곳에서 볼 수있는 유일한 곳은 .establishConnection() 메쏘드이지만, 그 메쏘드를 어디에 호출하는지는 알 수 없습니다.

따라서 문제는 .establishConnection() 메서드를 호출하지 않는 것이 가장 가능성이 큽니다.

2

당신이

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

하지 않으면 Client.socket가 null 전에 호출 establishConnection 방법인가하고 초기화 할 필요가 그것. 나는. 코드는 다음과 같이한다 :

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

관련 문제