【问题标题】:Null Pointer Exception from Java UDP来自 Java UDP 的空指针异常
【发布时间】:2016-02-10 04:26:52
【问题描述】:

这是我的主要方法:

public void broadcastName(final String name, final InetAddress broadcastIP) {
    // Broadcasts the name of the device at a regular interval
    System.out.println("Broadcasting started!");
    Thread broadcastThread = new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                String request = "ADD:"+name;
                byte[] message = request.getBytes();
                DatagramSocket socket = new DatagramSocket();
                socket.setBroadcast(true);
                DatagramPacket packet = new DatagramPacket(message, message.length, broadcastIP, BROADCAST_PORT);
                while(BROADCAST) {
                    System.out.println("socket: "+socket);
                    socket.send(packet);
                    System.out.println("Broadcast packet sent: " + packet.getAddress().toString());
                    Thread.sleep(BROADCAST_INTERVAL);
                }
                System.out.println("Broadcaster ending!");
                socket.disconnect();
                socket.close();
                return;
            }
            catch(SocketException e) {
                System.out.println("SocketException in broadcast: " + e);
                System.out.println("Broadcaster ending!");
                return;
            }
            catch(IOException e) {
                System.out.println("IOException in broadcast: " + e);
                System.out.println("Broadcaster ending!");
                return;
            }
            catch(InterruptedException e) {
                System.out.println("InterruptedException in broadcast: " + e);
                System.out.println("Broadcaster ending!");
                return;
            }
        }
    });
    broadcastThread.start();
}

当我在 while(BROADCAST) 行之后到达 socket.send(packet) 时,我总是收到此错误。

Exception in thread "Thread-1" java.lang.NullPointerException: null address || null buffer
at java.net.DualStackPlainDatagramSocketImpl.send(Unknown Source)
at java.net.DatagramSocket.send(Unknown Source)
at application.ContactManager$2.run(ContactManager.java:103)
at java.lang.Thread.run(Unknown Source)

我检查以确保套接字和数据包都不为空!还有什么可能是这里的罪魁祸首?

这个错误信息背后的含义是什么?

编辑

我正在一台 Windows 笔记本电脑上从 Eclipse 运行此代码。 我检索IP地址和设置广播IP的方式是这样的:

private static InetAddress getBroadcastIp() {
    // Function to return the broadcast address, based on the IP address of the device
    try {
        String addressString = InetAddress.getLocalHost().toString();
        InetAddress broadcastAddress = InetAddress.getByName(addressString);
        return broadcastAddress;
    }
    catch(UnknownHostException e) {
        System.out.println("UnknownHostException in getBroadcastIP: " + e);
        return null;
    }

}

【问题讨论】:

  • 尝试注释掉你的while循环,但留下我注释的循环的内容,看看你是否能干净地通过一次。如果不是,我会开始检查以验证您的 IP 和消息在每次发送后是否仍然有效。
  • 你是如何构建你的广播IP的?
  • @klog 是的,我什至一次都无法通过 while 循环。它在 while 循环的第二行抛出异常。我将开始研究消息和广播IP
  • @Evin1_ 我通过获取 localhost 并在其上调用 toString 方法来设置我的广播 IP。我在 SO 上的某处读到 getLocalHost 可能并非在所有情况下都有效,但在大多数情况下应该可以找到。
  • @Evin1_ 你的直觉太棒了!我错误地尝试获取 IP 地址。而不是 toString(),我需要调用 InetAddress.getLocalHost().getHostAddress();为我的 ip 获取 String 对象!谢谢你的建议!我不再收到异常,while 循环正在正确执行

标签: java android sockets udp


【解决方案1】:

将解决方案放在这里,正如 cmets 中提到的@WayWay:


当前代码在尝试获取 IP 地址时行为不正常,因为无法解析 .toString() 的结果,所以改为:

String addressString = InetAddress.getLocalHost().toString();
InetAddress broadcastAddress = InetAddress.getByName(addressString);

您应该尝试使用以下方法检索它:

InetAddress.getLocalHost().getHostAddress();

这样您将获得广播所需的正确InetAddress

【讨论】:

    猜你喜欢
    • 2015-03-23
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多