这里有个套接字类,用于发送消息,我使用了一个 List 来储存消息,然后用一个无线循环来发送消息,首先每个消息都设为一个类
public class SocketMsg{
public String ip;
public int port;
public byte[] msg;
};
然后我在某个单例类里有一个 List<SocketMsg>来储存要发送的消息,该类由一个函数,添加消息,整个程序都会用通过这个函数添加消息,类似下面的代码
public MyUdpSocket{
private MyUdpSocket mySocket = null;
public static MyUdpSocket getInstance(){
if(mySocket == null)
mySocket = new MyUdpSocket();
};
private List<SocketMsg> msgQueue = new AtrrayList<>();
public addMsgToQueue(SocketMsg msg){
msgQueque.add(msg);
};
};
然后这个 MyUdpSocket 类里还有个内部类,该类继承 Thread,类似下面代码
private class SendThread extends Thread {
private SendThread() {
}
@Override
public void run() {
while (true) {
if (udpSocket == null || udpSocket.isClosed()) {return;}
if(msgQueue.size() == 0) continue;
try {
SendMsg sendMsg = msgQueue.get(0);
InetAddress devAddress = InetAddress.getByName(sendMsg.IP);
DatagramPacket mDatagram = new DatagramPacket(sendMsg.Msg, sendMsg.Msg.length, devAddress, sendMsg.Port);
udpSocket.send(mDatagram);
msgQueue.remove(0); //唯一的 remove
} catch (Exception e) {
Log.d("sendMsg", "--消息发送失败--" + e);
}
}
}
}
首先,msgQueue 唯一的一个 remove()就在此处,程序的其他地方只有 add(),然后这个队列我采取发送第一个,然后删除第一个的方式
然后,程序随机的会报异常 java.lang.NullPointerException: Attempt to read from field 'java.lang.String com.wawa.MySocket.SendMsg.IP' on a null object reference
注意合格异常是随机的,大概 3-5 条消息,就会报一条
我想问下,这个大概是那里错了,我每次发送前都会检查 msgQueue 的 size(),如果为 0 就 continue,而且我反复确认,程序里 msgQueue 只有唯一的一处 remove(),我想问下,这个一般是什么情况
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.