来自 Java UDP 的空指针异常
Null Pointer Exception from Java UDP
这是我的主要方法:
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.run(ContactManager.java:103)
at java.lang.Thread.run(Unknown Source)
我检查确保套接字和数据包都不为空!还有什么可能是这里的罪魁祸首?
此错误消息背后的含义是什么?
编辑
我 运行 这段代码来自 Windows 笔记本电脑上的 Eclipse。
我检索 IP 地址和设置 broadcastIP 的方式是这样的:
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;
}
}
把解决方案放在这里,正如@WayWay在评论中提到的:
当前代码在尝试获取 IP 地址时表现不正常,因为无法解析 .toString()
的结果,因此改为:
String addressString = InetAddress.getLocalHost().toString();
InetAddress broadcastAddress = InetAddress.getByName(addressString);
您应该尝试通过以下方式检索它:
InetAddress.getLocalHost().getHostAddress();
这样您将获得广播所需的正确InetAddress
。
这是我的主要方法:
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.run(ContactManager.java:103)
at java.lang.Thread.run(Unknown Source)
我检查确保套接字和数据包都不为空!还有什么可能是这里的罪魁祸首?
此错误消息背后的含义是什么?
编辑
我 运行 这段代码来自 Windows 笔记本电脑上的 Eclipse。 我检索 IP 地址和设置 broadcastIP 的方式是这样的:
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;
}
}
把解决方案放在这里,正如@WayWay在评论中提到的:
当前代码在尝试获取 IP 地址时表现不正常,因为无法解析 .toString()
的结果,因此改为:
String addressString = InetAddress.getLocalHost().toString();
InetAddress broadcastAddress = InetAddress.getByName(addressString);
您应该尝试通过以下方式检索它:
InetAddress.getLocalHost().getHostAddress();
这样您将获得广播所需的正确InetAddress
。