package com.company.Client.tools;
import com.company.Client.view.FriendList;
import com.company.Client.view.TalkingView;
import com.company.Shared.Message;
import java.io.ObjectInputStream;
import java.net.Socket;
/**
* @Title:
* @Package
* @Description:客户端连接到服务器线程(对应ConnectThread)
* @author: Yeeasy
**/
public class UserThreads extends Thread {
private Socket socket;
ObjectInputStream in;
public UserThreads(Socket socket){
this.socket=socket;
}
public void run() {
while (true) {
try {
//接收ConnectThread来的信息
in = new ObjectInputStream(socket.getInputStream());
Message msg = (Message) in.readObject();
if(msg.getMsgType().equals("onlineSet")){
//修改用户列表好友在线状态
FriendList friendList=FriendListManage.getFriendList(msg.getUser());
System.out.println("进入更新列表");
friendList.UpdateFriendList(msg);
}else if(msg.getMsgType().equals("talk")){
System.out.println( msg.getUser()+"说:" + msg.getContent());
TalkingView talkingView=TalkingViewManage.getTalkingView(msg.getUser()+" "+msg.getFriend());
talkingView.showMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Socket getSocket() {
return socket;
}
}
[](链接: https://pan.baidu.com/s/1U9EwsWh5gZQLUonm5WhwHg?pwd=5sgh 提取码: 5sgh 复制这段内容后打开百度网盘手机App,操作更方便哦)
FriendList的构造器有段代码有问题,你不能重新把Friends赋值为new JLabel(5),这样的话会导致每次Friends都会是一个空的数组,所以你里面不会有用户信息,而且你的Friends不是静态的,而你每次登录后都是new FriendList对象,所以每个FriendList对象里面的Friends都是不一样的,你这里要实现在线好友统计的效果必须要用单例才可以。
再提一句代码规范的问题,方法名和常量名一定要用小写字母开头,不然看着代码很头大,会看成一个类名。
以下回答结合了ChatGPT:
这段代码中出现空指针异常的原因可能是FriendListManage.getFriendList(msg.getUser())返回的friendList对象为null。请检查FriendListManage.getFriendList()方法的实现是否正确,并确保该方法能够正确返回FriendList对象。如果返回值确实为null,则需要对null进行判断并进行相应处理,如创建新的FriendList对象并添加到FriendListManage中。另外,如果FriendList的更新方法UpdateFriendList()没有正确实现,也可能导致更新失败,请检查该方法的实现是否正确。