正在从主类调用的实用程序类的处理程序上出现null指针异常。套接字程序Android

正在从主类调用的实用程序类的处理程序上出现null指针异常。套接字程序Android,android,multithreading,sockets,handler,Android,Multithreading,Sockets,Handler,我创建了两个类,第一个是服务器类,它运行线程等待并接受来自客户端的套接字连接 第二个类是EchoThread类,它启动一个新线程,获取套接字连接传递的文本消息。这样做的原因是因为需要这样做,以便我可以一次将多个客户端连接到服务器。所以我创建了这个类。在服务器类的while(true)循环中调用它,以便在建立连接时启动新线程 问题在于,此应用程序的logcat是EchoThread类的nullPointer异常,位于以下行: handler.post(new Runnable() { 为什么

我创建了两个类,第一个是服务器类,它运行线程等待并接受来自客户端的套接字连接

第二个类是EchoThread类,它启动一个新线程,获取套接字连接传递的文本消息。这样做的原因是因为需要这样做,以便我可以一次将多个客户端连接到服务器。所以我创建了这个类。在服务器类的while(true)循环中调用它,以便在建立连接时启动新线程

问题在于,此应用程序的logcat是EchoThread类的nullPointer异常,位于以下行:

  handler.post(new Runnable() {
为什么我会收到此错误消息以及如何处理

服务器类:

  public class ServerThread implements Runnable {

    public void run() {
        try {
            if (SERVERIP != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverStatus = "Listening on IP: " + SERVERIP;
                    }
                });
                serverSocket = new ServerSocket(SERVERPORT);
                while (true) {
                    // listen for incoming clients
                    Socket client = serverSocket.accept();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            Intent intent = new Intent();
                            intent.setAction("com.example.diceRolled");
                            intent.putExtra("serverStatus","Connected");
                            sendBroadcast(intent);
                        }
                    });

                    new EchoThread(Server.this, client).start();

                } // end while(true) method  

            } else {  // the rest of the code for Server class....
EchoThread类:

 public class EchoThread extends Thread {
        protected Socket socket;
        private String line;
        private Handler handler;
        private Context context;
        private Socket client;

      public EchoThread(Context c, Socket clientSocket) {
                        this.socket = clientSocket;
                        this.context = c;
      }

      public void run(){
      try {
          BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));

          while ((line = in.readLine()) != null) {
          //    Log.d("ServerActivity", line);
              handler.post(new Runnable() {
                  private String receivedCommand;

                @Override
              public void run() {
              receivedCommand = line;

              Intent intent = new Intent();
                intent.setAction("com.example.diceRolled");
                intent.putExtra("serverStatus", line.trim());
                context.sendBroadcast(intent);


  Toast.makeText(context, "sent message " + receivedCommand, Toast.LENGTH_SHORT).show();

  // the rest of the code for EchoThread class....

您的处理程序保持为
null
,因为您将其作为类变量

private Handler handler;
但实际上你从来没有给过它任何东西

当你遇到

handler.post()
一个NPE被抛出

因此,您必须实例化
处理程序
,或者给它一个非空的引用来保存

如果您想要更多关于处理程序和循环器的信息,并且可能有价值(与SO答案相同的链接)