通过套接字接收数组列表时出现NullPointerException

时间:2014-01-07 12:53:48

标签: java sockets ipc

尝试通过套接字发送arrayList,在对象输入流初始化(客户端)时获取空指针异常。

客户端:

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
}

我一直试图在套接字上通信两天,但几乎没有成功。我不知道是怎么回事。当我有更多时间时,我打算更好地记录自己,但现在我真的很想了解发生了什么。

修改

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

2 个答案:

答案 0 :(得分:2)

您之前调用了establishConnection方法

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

如果没有,您的Client.socket为null,您需要初始化它。即您的代码应如下所示:

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

答案 1 :(得分:2)

因为NPE就在这条线上:

Client.socket.getInputStream());

只有一件事可以导致它。它不能是Client,因为它是static。它不能是getInputStream(),因为这是一种方法,因此它必须是导致NPE的socket

在这一行:

private static Socket socket = null;

您将socket设为null。我看到你将它设置为非空的唯一地方是.establishConnection()方法,但我看不到你在哪里调用该方法。

因此,您的问题很可能是您没有调用.establishConnection()方法。