日期:2014-05-20  浏览次数:20699 次

一个Bug
	
//在此处完成消息的接受和转发,而且应该是一个一直在监听的状态。
public void run(){
while(true){
try {
System.out.println(ManageServerConClientThreadTable.table);
ObjectInputStream mesgFromClient = new ObjectInputStream(socket.getInputStream());
Message mesg = (Message)mesgFromClient.readObject();
System.out.print(mesg.getSender() + "对" + mesg.getReciever() + "说:" + mesg.getContents() + "\n");
System.out.println(ManageServerConClientThreadTable.getServerConClientThread(mesg.getSender()));
System.out.println(ManageServerConClientThreadTable.getServerConClientThread(mesg.getReciever()));
System.out.println(ManageServerConClientThreadTable.table);
if(ManageServerConClientThreadTable.table.containsKey(mesg.getReciever())){
System.out.println("存在");
}
ServerConClientThread scc = ManageServerConClientThreadTable.getServerConClientThread(mesg.getReciever());
if(scc == null){
System.out.println("scc为空");
}
ObjectOutputStream mesgToClient = new ObjectOutputStream(scc.socket.getOutputStream());
mesgToClient.writeObject(mesg);

catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}


小弟在写一个山寨QQ聊天程序。在写服务器时,出现了一个bug。贴出了部分代码。
问题如下:当我登录一个QQ时,服务器就用HashMap维护一个线程来进行消息的接受和转发,
接受倒是能够正常接受,但是在转发时,总是报空指针错误。
登录第一个QQ
打印出:
1
Thread[Thread-3,6,main]
1放入Map中成功
{1=Thread[Thread-3,6,main]} 

登录第二个QQ
打印出:
2
Thread[Thread-4,6,main]
2放入Map中成功
{2=Thread[Thread-4,6,main], 1=Thread[Thread-3,6,main]} 

在聊天窗口中输入消息:da,点击发送后就报空指针了。
打印出:

1对2 说:da
Thread[Thread-3,6,main]
null
{2=Thread[Thread-4,6,main], 1=Thread[Thread-3,6,main]}
scc为空
{2=Thread[Thread-4,6,main], 1=Thread[Thread-3,6,main]}
java.lang.NullPointerException
 at qq.server.model.ServerConClientThread.run(ServerConClientThread.java:36) 
我不明白的是明明HashMap打印出来的值明明显示有2=Thread[Thread-4,6,main],但ManageServerConClientThreadMap.getServerConClientThread(mesg.getReciever())
却得到null的值。这是为什么呢?
ps:ManageServerConClientThreadMap这个类是维护HashMap

------解决方案--------------------
if(ManageServerConClientThreadTable.table.containsKey(mesg.getReciever())){                     System.out.println("存在");                 } 

这个“存在”没有打印出来吧?
当你设置table的时候,是将mesg.getReciever设置为ManageServerConClientThreadTable.table的Key吗?
设置断点 一步步调试
光看这几行代码
只能猜测了

------解决方案--------------------
"1对2 说:da",看这块输出貌似mesg.getReciever()返回的内容多了个空格?加上".trim()"试试。