此問題正在推動我在牆上。這是一個很簡單簡單的在線多人遊戲,我目前正在努力。在通過UDP發送到java客戶端後,序列化對象具有空值
我目前能夠通過udp發送數據包給我的客戶端,他們似乎收到他們罰款。但是,當我向客戶端發送序列化對象並在另一端反序列化時,當我嘗試訪問我需要的值時,我得到NullPointerExceptions。我已經驗證了服務器端的對象被正確序列化(反序列化並檢查了數據),所以我99%確定我在發送數據包的代碼時做了一些非常錯誤的事情。
以下是序列化和從所述服務器發送「數據報」對象的代碼:
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異常。如果有人能指引我正確的方向,我會非常高興。
哦,我現在正在故意發送給localhost,只是爲了測試一下。我的客戶端和服務器都在我的機器上運行。
感謝您的提醒。爲例外添加了獨特的打印輸出,但是我仍然沒有接近解決這個問題。 – araisbec
你的投注是正確的。從現在開始,我將明確地就您的建議妥善處理我的例外情況。現在,你爲什麼認爲我會得到這種例外? Datagram是我創建的類,源文件位於我的源代碼目錄中(我在Netbeans中)...我甚至可以創建它的對象。 – araisbec
你是男人。我追求這個問題,並通過閱讀你的另一個帖子來發現問題。我在服務器端創建了一個Datagram類的* copy *對象,但是不同的*包名*。我不知道這是那麼敏感。 – araisbec