Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过套接字接收数组列表时出现NullPointerException_Java_Sockets_Ipc - Fatal编程技术网

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

Java 通过套接字接收数组列表时出现NullPointerException,java,sockets,ipc,Java,Sockets,Ipc,尝试通过套接字发送arrayList时,在对象输入流初始化客户端上获取空指针异常 客户: try { ObjectInputStream objIn = new ObjectInputStream( Client.socket.getInputStream()); // HERE library = (ArrayList<Book>) objIn.readObject(); } catch (IOException

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

客户:

try {
        ObjectInputStream objIn = new ObjectInputStream(
               Client.socket.getInputStream()); // HERE
        library = (ArrayList<Book>) objIn.readObject();
    } catch (IOException e) {
我已经尝试通过套接字进行通信两天了,但几乎没有成功。我不知道发生了什么事。Ofc我计划在有更多时间时更好地记录自己,但现在我真的很想了解发生了什么

编辑

服务器:

try {
    ObjectOutputStream objOut = new ObjectOutputStream(
            this.client.getOutputStream());
    objOut.writeObject(library);
    objOut.flush(); // added later, not helping
}
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();
        }
    }
}
您以前调用过连接方法吗

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) {
您以前调用过连接方法吗

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) {

因为NPE在这条线上:

Client.socket.getInputStream());
private static Socket socket = null;
只有一件事可以导致它。它不能是客户端,因为它是静态的。它不能是getInputStream,因为这是一个方法,所以它必须是导致NPE的套接字

在这一行:

Client.socket.getInputStream());
private static Socket socket = null;
您将套接字设置为空。我看到的唯一一个将其设置为NOTNULL的地方是在.ESTABLICONNECTION方法中,但我看不到在哪里调用该方法


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

,因为NPE在这条线上:

Client.socket.getInputStream());
private static Socket socket = null;
只有一件事可以导致它。它不能是客户端,因为它是静态的。它不能是getInputStream,因为这是一个方法,所以它必须是导致NPE的套接字

在这一行:

Client.socket.getInputStream());
private static Socket socket = null;
您将套接字设置为空。我看到的唯一一个将其设置为NOTNULL的地方是在.ESTABLICONNECTION方法中,但我看不到在哪里调用该方法


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

此问题中的代码不足,无法给出答案。请告诉我们Client.socket的定义和实例化位置。最好张贴一篇演示问题的文章。你能提供堆栈跟踪并显示它投诉的行号吗?在这种情况下,这通常非常有用。@Duncan Ok会试试@CodeChimp,堆栈跟踪指向//在我的代码中看到:您是否调用过客户端的establishConnection方法?此问题中的代码不足,无法给出答案。请告诉我们Client.socket的定义和实例化位置。最好张贴一篇演示问题的文章。你能提供堆栈跟踪并显示它投诉的行号吗?在这种情况下,这通常非常有用。@Duncan Ok会试试@CodeChimp,堆栈跟踪指向//在我的代码中看到:您是否调用过客户端的establishConnection方法?确实如此。当我开始移动东西时,我忘了打电话。建立连接。当我开始移动东西时,我忘了打电话。建立连接