Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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';s运行方法_Java_Multithreading_Sockets_Nullpointerexception - Fatal编程技术网

Java 线程中的NullPointerException';s运行方法

Java 线程中的NullPointerException';s运行方法,java,multithreading,sockets,nullpointerexception,Java,Multithreading,Sockets,Nullpointerexception,我非常感谢您对我的计划的帮助。它是一种具有多个客户端的聊天服务器。 以下是服务器代码: package com.server; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static int PORT; private ServerSocket server; private Socket

我非常感谢您对我的计划的帮助。它是一种具有多个客户端的聊天服务器。 以下是服务器代码:

package com.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
    public static int PORT;
    private ServerSocket server;
    private Socket socket;

    public Server(int port) throws IOException {
        PORT = port;
        server = new ServerSocket(PORT);
        System.out.println("server started");
        try {
            while (true) {
                socket = server.accept();
                try {
                    new ServeClient(socket);
                } catch (IOException e) {
                    socket.close();
                }
            }
        } finally {
            server.close();
        }

    }

    public static void main(String[] args) throws IOException {
        int port = Integer.parseInt(args[0]);
        Server server = new Server(port);
    }

}
我启动服务器,然后创建一个客户端。服务器从套接字接收连接套接字 并创建一个ServeClient线程。 以下是ServeClient代码:

package com.server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Enumeration;
import java.util.Vector;

import com.gui.WindowManager;

public class ServeClient extends Thread {
    private final Socket socket;
    private BufferedReader in;
    private PrintWriter out;
    private String msg;
    public static final String ENDSTRING = "END";
    public static Vector clients = new Vector();

    public ServeClient(final Socket socket) throws IOException {
        this.socket = socket;
        System.out.println("socket " + socket);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                socket.getOutputStream())), true);
        start();
    }

    public void run() {
        try {
            clients.add(this);
            while (true) {
                msg = in.readLine();
                if (msg == ENDSTRING)
                    break;
                broadcast(msg);
            }
            System.out.println("closing...");
        } catch (IOException e) {
            System.err.println("IO EXCEPTION");
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                System.err.println("SOCKET NOT CLOSED");
            }
        }
    }

    @SuppressWarnings("deprecation")
    public void broadcast(String msg) {
        synchronized (clients) {
            Enumeration<ServeClient> e = clients.elements();
            while (e.hasMoreElements()) {
                ServeClient serveClient = e.nextElement();
                try {
                    synchronized (serveClient.out) {
                        serveClient.out.println(msg);
                    }
                } catch (Exception eee) {
                    serveClient.stop();
                }
            }
        }
    }
}
第33行是ServeClient run()方法中第一个“try”语句所在的行

我不相信这是在尝试中发生的

打开一个IDE,打开调试,然后逐步执行,直到可以看到发生了什么。这是找出你错过了什么的最快方法

有一个物体你认为是好的,但事实并非如此。找到它

以下是如何正确执行此操作的示例:

我不相信这是在尝试中发生的

打开一个IDE,打开调试,然后逐步执行,直到可以看到发生了什么。这是找出你错过了什么的最快方法

有一个物体你认为是好的,但事实并非如此。找到它

以下是如何正确执行此操作的示例:


您的问题在于静态实例变量的初始化顺序。试着做一些类似的事情:

...
private static Vector clients = null;
...
if (clients==null) {
    clients = new Vector(); // consider putting this in a synchronized block
}

在将客户端添加到向量之前。

您的问题在于静态实例变量的初始化顺序。试着做一些类似的事情:

...
private static Vector clients = null;
...
if (clients==null) {
    clients = new Vector(); // consider putting this in a synchronized block
}

在您将客户端添加到向量之前。

很抱歉,出现了这样一个老问题,但这个问题似乎没有得到解决,因此我将从我的角度提供一些信息

我也遇到过类似的问题,编译器也一直告诉我问题出在start()方法上。然而,当我注释掉线程部分并在与UI相同的线程上运行代码时,编译器将我引导到问题的真正根源:线程中的代码

在确保代码没有给出错误后,我将代码与原始线程代码一起封装,它不再给出NullPointerException错误


希望这对其他人有所帮助。

很抱歉,出现了这样一个老问题,但这个问题似乎没有得到解决,因此我将从我的角度提供一些信息

我也遇到过类似的问题,编译器也一直告诉我问题出在start()方法上。然而,当我注释掉线程部分并在与UI相同的线程上运行代码时,编译器将我引导到问题的真正根源:线程中的代码

在确保代码没有给出错误后,我将代码与原始线程代码一起封装,它不再给出NullPointerException错误


希望这对其他人有所帮助。

删除JPanel中重复的类声明

我试着运行一个定时器线程,更新主应用程序窗口中的时钟


我用Eclipse/WindowBuilder创建了JFrame,并遵循了关于如何制作计时器的教程。我已将textfield的声明复制到类声明中,以使其可用于整个类,但忘记删除小部件定义前面的类Id。所以它仍然初始化了本地实例,而不是全局实例。因此,当我访问全局声明时,它仍然为空。

删除JPanel中的重复类声明

我试着运行一个定时器线程,更新主应用程序窗口中的时钟


我用Eclipse/WindowBuilder创建了JFrame,并遵循了关于如何制作计时器的教程。我已将textfield的声明复制到类声明中,以使其可用于整个类,但忘记删除小部件定义前面的类Id。所以它仍然初始化了本地实例,而不是全局实例。因此,当我访问全局文件时,它仍然为空。

堆栈跟踪告诉您异常发生在哪一行:ServeClient.java:33。这是哪条线?此外,永远不要将字符串与==进行比较。使用equals。代码在我的机器上运行。我几乎很想猜测你的Java设置有问题。随机的想法:端口正在使用吗?尝试更改它堆栈跟踪告诉您异常发生在哪一行:ServeClient.java:33。这是哪条线?此外,永远不要将字符串与==进行比较。使用equals。代码在我的机器上运行。我几乎很想猜测你的Java设置有问题。随机的想法:端口正在使用吗?尝试更改itOk,我尝试对整个过程进行bug,调用start0()方法后,线程类中出现了NullPointerException。现在我什么都不懂(((我正在使用Eclipse,sry我拼错了,ofc我调试了itOk,我试图对整个事情进行bug,调用start0()方法后,线程类中出现了NullPointerException。现在我什么都不懂。)(((我正在使用Eclipse,sry我拼错了,ofc我调试了它,这根本不是问题。静态初始值设定项在类初始化时运行,这肯定是在类实例化之前,因此在类中的任何非静态代码运行之前。这根本不是问题。静态初始值设定项在类初始化时运行,这在类被实例化之前,因此在类中的任何非静态代码运行之前。
...
private static Vector clients = null;
...
if (clients==null) {
    clients = new Vector(); // consider putting this in a synchronized block
}