我有以下Java while
循环:
while(true){
byte buffer[] = new byte[MAX_PDU_SIZE];
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
Pdu pdu = pduFactory.createPdu(packet.getData());
System.out.print("Got PDU of type: " + pdu.getClass().getName());
if(pdu instanceof EntityStatePdu){
EntityID eid = ((EntityStatePdu)pdu).getEntityID();
Vector3Double position = ((EntityStatePdu)pdu).getEntityLocation();
System.out.print(" EID:[" + eid.getSite() + ", " + eid.getApplication() + ", " + eid.getEntity() + "] ");
System.out.print(" Location in DIS coordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]");
}
System.out.println();
}
}
while循环的预期功能是捕获通过网络发送的任何PDU,并显示有关它们的信息。
当我运行代码时,我会在控制台中获得我想要的输出 - 至少最初...但是在它返回了有关多个PDU的信息之后,我在控制台中显示了一个错误(我不记得它现在说了什么 - 但我想这可能是因为它在没有发送的时候试图捕获PDU。
我已经尝试修改我的代码,以解释在尝试通过使用以下try-catch循环包围代码来捕获有关PDU的信息时可能无法通过网络接收PDU的情况:
try{
socket = new MulticastSocket(EspduSender.PORT);
address = InetAddress.getByName(EspduSender.DEFAULT_MULTICAST_GROUP);
socket.joinGroup(address);
while(true){
byte buffer[] = new byte[MAX_PDU_SIZE];
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
Pdu pdu = pduFactory.createPdu(packet.getData());
System.out.print("Got PDU of type: " + pdu.getClass().getName());
if(pdu instanceof EntityStatePdu){
EntityID eid = ((EntityStatePdu)pdu).getEntityID();
Vector3Double position = ((EntityStatePdu)pdu).getEntityLocation();
System.out.print(" EID:[" + eid.getSite() + ", " + eid.getApplication() + ", " + eid.getEntity() + "] ");
System.out.print(" Location in DIS coordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]");
}
System.out.println();
}
}
catch(Exception e){
System.out.println(e);
System.out.println("This is where the error is being generated");
}
但是,当我现在运行代码时 - 它仍会显示它捕获的前x个DIS数据包(每次运行代码时x都会不同),但随后会给我一个java.lang.NullPointerException
。
据我所知,这可能是因为代码捕获的PDU不包含任何信息(即“空”PDU),或者因为它在没有&#39时尝试接收PDU ;一个是通过网络发送的。
如何制作代码'跳过'它没有收到PDU,只是继续运行的场合?或者我还应该做些什么来摆脱这个错误?
答案 0 :(得分:0)
这可能无法解决您的问题(直到您放置堆栈跟踪才会知道),但您可以在使用之前检查pdu是否为null。
while(true){
byte buffer[] = new byte[MAX_PDU_SIZE];
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
Pdu pdu = pduFactory.createPdu(packet.getData());
if (pdu != null) {
System.out.print("Got PDU of type: " + pdu.getClass().getName());
if(pdu instanceof EntityStatePdu){
EntityID eid = ((EntityStatePdu)pdu).getEntityID();
Vector3Double position = ((EntityStatePdu)pdu).getEntityLocation();
System.out.print(" EID:[" + eid.getSite() + ", " + eid.getApplication() + ", " + eid.getEntity() + "] ");
System.out.print(" Location in DIS coordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]");
}
System.out.println();
}
}
如果您获得了堆栈跟踪,我可以根据您的实际问题进行更改。
答案 1 :(得分:0)
你的代码看起来完全没问题,除了下面的缺失行。
if (pdu != null) {
//execute this
}