奇怪的空引用异常

时间:2008-12-26 23:16:47

标签: c# .net nullreferenceexception

所以我有这个代码来处理来自远程计算机的命令确认,有时候(比如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();
        }
    }

8 个答案:

答案 0 :(得分:4)

根据您提供的信息,在该位置无法进行空引用。所以接下来的问题是“你怎么知道特定的行正在创建NullReferenceException?”您使用的是调试器还是堆栈跟踪信息?您是在检查代码的零售版还是调试版?

如果是调试器,各种设置组合实际上可以使调试器出现以在不同的地方报告NullRef。这样做的主要原因是Just My Code设置。

根据我的经验,我发现确定实际发生的异常行的最可靠方法是......

  1. 关闭JMC
  2. 使用Debug编译
  3. 调试器 - >设置 - >打破投掷CLR例外。
  4. 检查调试器窗口中的StackTrace属性

答案 1 :(得分:2)

ReadString()是否可能返回null?这会导致GetType失败。也许你收到了一个空包?或者,字符串可能与类型不匹配,因此稍后使用时commandType将为null。

修改: 您是否在调用m_CurrentCommand时检查ProcessCommandAcknowledgment是否为空?

答案 2 :(得分:2)

我敢打赌你的TCP框架代码有问题(如果你有的话!)

“PacketReader”或许表明你没有。因为从技术上讲,它会被称为“FrameReader”或类似的东西。

如果涉及的两台PC都在本地局域网上,那么它可能会解释14天的时间间隔。如果您通过互联网尝试此操作,我敢打赌您的错误频率会更加常见,尤其是在广域网带宽受到争议的情况下。

答案 3 :(得分:1)

如果您启用了优化功能,则可能会将您指向一个非常错误的位置。

几年前发生过类似事情。

答案 4 :(得分:1)

或者是一个可能的线程竞争,其中上下文被另一个线程设置为null。这也可以解释错误的不常见。

答案 5 :(得分:1)

好的,这只是一些可能性。

  1. 当你打电话给那个例行公事时,不知怎的,你的计算机参考被打破了。

  2. 调用下的东西是抛出空指针取消引用错误,但是在该行检测到它。

  3. 看着它,我非常怀疑堆栈是否已损坏,导致您的computer自动被破坏。检查子程序/方法/函数调用周围你遇到的问题;特别是,检查你在“计算机”项目中制作的内容确实是你期望的类型。

答案 6 :(得分:1)

其他线程在做什么?

编辑:您提到服务器是单线程的,但另一条评论表明此部分是单线程的。如果是这种情况,您仍可能遇到并发问题。

我认为,这里的底线是您有多线程问题或CLR错误。你可以猜出我认为哪个更有可能。

答案 7 :(得分:1)

  

computer.ProcessCommandAcknowledgment(commandType);

您是否有调试符号可以进入此步骤?

ProcessCommandAcknowledgement可以抛出null ref异常,并冒泡。