2011-09-29 81 views
0

我真的很感谢我的程序帮助。它是一种具有多个客户端的聊天服务器。 这里的服务器代码:线程运行方法中的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 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(); 
       } 
      } 
     } 
    } 
} 

什么,我得到的是一个NullPointerException异常时ServeClient调用run()方法

server started 
socket Socket[addr=/127.0.0.1,port=51438,localport=8888] 
Exception in thread "Thread-0" java.lang.NullPointerException 
    at com.server.ServeClient.run(ServeClient.java:33) 

线33与第一行 “尝试” 在ServeClient运行的语句()方法

+0

堆栈跟踪告诉你在哪一行发生异常:ServeClient.java:33。哪条线?另外,你不应该使用==比较字符串。使用等于。 –

+0

该代码在我的机器上运行。我几乎会猜测你的Java安装程序有什么问题。 – Dolda2000

+0

随机想法:是否在使用端口?尝试改变它 –

回答

2
com.server.ServeClient.run(ServeClient.java:33) 

我不相信这是在尝试发生。

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

有一个对象,你假设没有。找到它。

下面是如何做到这一点正确的例子:

http://www.kodejava.org/examples/216.html

+0

好吧,我试图bug的这一切,并调用start0()方法后,Thread类中发生NullPointerException。现在我不完全了解任何东西((( – poss

+0

)你的意思是你试图调试它?你在用什么IDE? – duffymo

+0

我使用Eclipse,sry我拼错了,ofc我放了它 – poss

1

你的问题是在静态实例变量被初始化的顺序。尝试做类似:

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

添加客户端向矢量之前。

+0

我添加了这段代码,它没有(( – poss

+0

))这并不是问题,静态初始化器在类初始化时运行,这肯定是在类被实例化之前,因此在运行它的任何非静态代码之前。 – Dolda2000

1

对不起这样的旧问题,但似乎这个问题没有解决,所以我会给我一点输入从我的结尾。

我有一个类似的问题,编译器也不断告诉我,问题是在start()方法。但是,当我将线程部分注释掉,并且只是在与UI相同的线程上运行代码时,编译器将我引向问题的真正来源:线程内的代码。

在确定代码没有给出错误之后,我用原始线程代码包含了代码,并且它停止给我发出NullPointerException错误。

希望这可以帮助一路上的人。

0

删除JPanel中的重复类声明。

我正试图运行一个计时器线程,更新主应用程序窗口中的时钟。

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

相关问题