这个问题让我陷入困境。这是我正在进行的非常简单的在线多人游戏。
我目前能够通过udp将数据包发送到我的客户端,他们似乎很好。但是,当我将一个序列化对象发送到我的客户端并在另一端反序列化时,当我尝试访问我需要的值时,我得到NullPointerExceptions。我已经验证对象在服务器端正确序列化(反序列化并检查数据),所以我99%确定我在发送数据包的代码时做了一些非常错误。
以下是从服务器序列化和发送“Datagram”对象的代码:
DatagramPacket sendPacket = null;
byte[] buf = null;
//Serialize the datagram object to send as a UDP packet
try {
// Serialize to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(data);
buf = bos.toByteArray();
out.close();
bos.close();
} catch (IOException e) {
}
try {
sendPacket = new DatagramPacket( buf, buf.length,
InetAddress.getLocalHost(), 4004);
} catch (UnknownHostException e){}
try {
DatagramSocket sendSocket = new DatagramSocket();
sendSocket.send( sendPacket );
changed = true;
}catch (IOException e) {}
被序列化的“数据”对象充满了正确的值;我很确定。
另一个相关的代码块是客户端的接收块:
public Datagram readDatagram() {
byte[] buff = new byte[20000];
DatagramPacket packet = new DatagramPacket(buff, buff.length);
DatagramSocket receiver = null;
try {
receiver = new DatagramSocket(4004);
receiver.receive(packet);
} catch (IOException e) {
System.out.println("ERROR2");
}
Datagram data = null;// = new Datagram();
try {
// Deserialize from a byte array
ByteArrayInputStream bis = new ByteArrayInputStream(buff);
ObjectInput in = new ObjectInputStream(bis);
data = (Datagram) in.readObject();
bis.close();
in.close();
} catch (ClassNotFoundException e) {
} catch (IOException e) {
System.out.println("ERROR3");
}
for (int i = 0; i < 35; i++) {
System.out.print(data.getLevel()[i]);
}
receiver.close();
return data;
}
当我在反序列化后尝试读取任何值时,我得到NullPointerException。如果有人能指出我正确的方向,我将非常高兴。
哦,我现在正故意向当地主人发送信息。我的客户端和服务器都在我的机器上运行。
答案 0 :(得分:2)
在发送和接收端,您正在捕捉和压缩异常。很有可能这隐藏了可以帮助您诊断问题的证据。即使不是这种情况,压缩像这样的例外也是危险的做法。
我敢打赌,接收端代码中会抛出ClassNotFoundException
。这将使您data == null
,然后在随后的循环中导致NPE。
答案 1 :(得分:2)
您的代码可能存在的一个问题是,在关闭toByteArray()
之前请致电ObjectOutputStream
:
out.writeObject(data);
buf = bos.toByteArray();
out.close();
bos.close();
如果序列化数据的某些部分在close()
之前未写入输出流,则在这种情况下它们将丢失。关闭流后尝试调用toByteArray()
。