所以我有这个代码来处理来自远程计算机的命令确认,有时候(比如14天或者其他什么)下面的行引发了一个空引用异常:
computer.ProcessCommandAcknowledgment( commandType );
真正让我感到困惑的是我在它之前检查了一个空引用,所以我有没有的想法发生了什么。 以下是其价值的完整方法:
public static void __CommandAck( PacketReader reader, SocketContext context )
{
string commandAck = reader.ReadString();
Type commandType = Type.GetType( commandAck );
Computer computer = context.Client as Computer;
if (computer == null)
{
Console.WriteLine("Client already disposed. Couldn't complete operation");
}
else
{
computer.ProcessCommandAcknowledgment( commandType );
}
}
任何线索?
编辑:ProcessCommandAcknowledgment:
public void ProcessCommandAcknowledgment( Type ackType )
{
if( m_CurrentCommand.GetType() == ackType )
{
m_CurrentCommand.Finish();
}
}
答案 0 :(得分:4)
根据您提供的信息,在该位置无法进行空引用。所以接下来的问题是“你怎么知道特定的行正在创建NullReferenceException?”您使用的是调试器还是堆栈跟踪信息?您是在检查代码的零售版还是调试版?
如果是调试器,各种设置组合实际上可以使调试器出现以在不同的地方报告NullRef。这样做的主要原因是Just My Code设置。
根据我的经验,我发现确定实际发生的异常行的最可靠方法是......
答案 1 :(得分:2)
ReadString()
是否可能返回null?这会导致GetType失败。也许你收到了一个空包?或者,字符串可能与类型不匹配,因此稍后使用时commandType将为null。
修改强>:
您是否在调用m_CurrentCommand
时检查ProcessCommandAcknowledgment
是否为空?
答案 2 :(得分:2)
我敢打赌你的TCP框架代码有问题(如果你有的话!)
“PacketReader”或许表明你没有。因为从技术上讲,它会被称为“FrameReader”或类似的东西。
如果涉及的两台PC都在本地局域网上,那么它可能会解释14天的时间间隔。如果您通过互联网尝试此操作,我敢打赌您的错误频率会更加常见,尤其是在广域网带宽受到争议的情况下。
答案 3 :(得分:1)
如果您启用了优化功能,则可能会将您指向一个非常错误的位置。
几年前发生过类似事情。答案 4 :(得分:1)
或者是一个可能的线程竞争,其中上下文被另一个线程设置为null。这也可以解释错误的不常见。
答案 5 :(得分:1)
好的,这只是一些可能性。
当你打电话给那个例行公事时,不知怎的,你的计算机参考被打破了。
调用下的东西是抛出空指针取消引用错误,但是在该行检测到它。
看着它,我非常怀疑堆栈是否已损坏,导致您的computer
自动被破坏。检查子程序/方法/函数调用周围你遇到的问题;特别是,检查你在“计算机”项目中制作的内容确实是你期望的类型。
答案 6 :(得分:1)
其他线程在做什么?
编辑:您提到服务器是单线程的,但另一条评论表明此部分是单线程的。如果是这种情况,您仍可能遇到并发问题。
我认为,这里的底线是您有多线程问题或CLR错误。你可以猜出我认为哪个更有可能。
答案 7 :(得分:1)
computer.ProcessCommandAcknowledgment(commandType);
您是否有调试符号可以进入此步骤?
ProcessCommandAcknowledgement可以抛出null ref异常,并冒泡。