0

所以我有这段代码负责远程计算机的命令确认,有时(比如 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 );
        }
    }

有什么线索吗?

编辑:ProcessCommandAcknowledgement:

    public void ProcessCommandAcknowledgment( Type ackType )
    {
        if( m_CurrentCommand.GetType() == ackType )
        {
            m_CurrentCommand.Finish();
        }
    }
4

8 回答 8

4

根据您提供的信息,在该位置出现空 ref 肯定是不可能的。所以下一个问题是“你怎么知道特定的行正在创建 NullReferenceException?” 您使用的是调试器还是堆栈跟踪信息?您是否正在检查代码的零售或调试版本?

如果是调试器,则各种设置组合基本上会导致调试器出现在不同的位置报告 NullRef。这样做的主要是 Just My Code 设置。

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

  1. 关闭江铃
  2. 用调试编译
  3. 调试器 -> 设置 -> 抛出 CLR 异常时中断。
  4. 检查调试器窗口中的 StackTrace 属性
于 2008-12-26T23:58:49.600 回答
2

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

编辑:您是否m_CurrentCommand在调用时检查过不为空ProcessCommandAcknowledgment

于 2008-12-26T23:25:07.093 回答
2

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

“PacketReader”可能暗示您不这样做。因为,从技术上讲,如果你这样做,它将被称为“FrameReader”或类似的东西。

如果涉及的两台 PC 位于本地 LAN 或其他地方,那么它可能会解释 14 天的间隔。如果您通过 Internet 尝试此操作,我敢打赌您的错误频率会更常见,尤其是在 WAN 带宽被争用的情况下。

于 2008-12-27T00:12:07.203 回答
1

如果您打开了优化,它可能会将您指向一个非常错误的地方,它实际上发生了。

几年前,类似的事情发生在我身上。

于 2008-12-27T00:16:52.963 回答
1

或者在某个地方可能发生线程竞争,其中上下文被另一个线程设置为空。这也可以解释错误的罕见性。

于 2008-12-27T00:18:55.643 回答
1

好吧,实际上只有几种可能性。

  1. 不知何故,当您调用该例程时,您的计算机参考信息已被篡改。

  2. 调用下的某些内容引发了空指针取消引用错误,但在该行检测到它。

看着它,我非常怀疑堆栈正在损坏,导致您的computer自动装置损坏。检查您遇到问题子程序/方法/函数调用;特别是,检查您正在制作的“计算机”项目是否真的是您期望的类型。

于 2008-12-27T00:25:05.787 回答
1

其他线程在做什么?

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

我认为,这里的底线是你要么有一个多线程问题,要么有一个 CLR 错误。你可以猜到我认为哪个更有可能。

于 2008-12-27T00:37:31.300 回答
1

computer.ProcessCommandAcknowledgment(commandType);

你有调试符号可以进入这个吗?

空引用异常可能由 ProcessCommandAcknowledgement 抛出,并冒泡。

于 2008-12-27T00:48:34.850 回答