java null指针异常 - 在while循环中的不同点发生

时间:2014-04-14 14:15:07

标签: java nullpointerexception

我有以下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,只是继续运行的场合?或者我还应该做些什么来摆脱这个错误?

2 个答案:

答案 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
}