3 回答
TA贡献1809条经验 获得超8个赞
此代码的问题在于,当交换机向控制器发送新数据包时,会调用 receive() 方法或(假设)处于活动状态。
这里当第一个控制器收到 ICMP 数据包时,它通过这段代码向第二个控制器发送一个 hello 消息:
hacontroller.send("127.0.0.1:4243", "mHelloWorld");
但是由于第二个控制器没有收到来自交换机的任何消息,它目前没有实现这段代码(receive()),也没有看到:
hacontroller.recv("127.0.0.1:4242");
据我所知,这就是为什么clientSock
从未初始化的原因,所以我收到了这个错误。
TA贡献1820条经验 获得超9个赞
NetworkNode.recv() 方法存在多个问题:
您应该在取消引用对象之前检查 null。
您不应在 String 对象上调用 toString。这是多余的。
在捕获和忽略异常时应该小心。在这种情况下,您不需要捕获异常,因为 NioClient.recv() 不会抛出任何异常。该方法应该抑制异常的地方是另一个问题。
避免使用成员变量而不是局部变量。需要在每个方法中声明局部变量。这是代码中许多地方的常见问题。
接收方法可以改写如下:
NioClient receivingSock = socketDict.get(receivingPort);
if (receivingSock == null) {
logger.debug("[NetworkNode] No receivingSock on receivingport: " + receivingPort);
return "";
}
else {
response = receivingSock.recv();
if (response != null) {
response.trim();
}
return response;
}
TA贡献1818条经验 获得超8个赞
从您发布的日志和您提供的 Github 存储库来看,似乎clientSock
是null
. 第NullPointerException
529 行抛出第一个:
response = clientSock.recv();
和被抓住。
但是在 catch 块中,clientSock
is still null
,所以当你这样做时:
if (clientSock.getSocketChannel() != null) {
一秒钟NullPointerException
被抛出(我们在日志中看到的那个)隐藏了之前抛出的那个。
你能调试你的代码来验证是否socketDict
包含receivingPort
吗?如果没有,请务必正确初始化。
此外,捕捉通常不是一个好主意,Exception
因为它太大了。如果可以,我建议您捕获更精确的异常(或异常)。如果你这样做了,你会更容易看到这个错误的来源。
添加回答
举报