代码之家  ›  专栏  ›  技术社区  ›  arul

奇怪的空引用异常

  •  0
  • arul  · 技术社区  · 17 年前

    因此,我有一段代码,负责远程计算机的命令确认,有时(比如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();
            }
        }
    
    8 回复  |  直到 17 年前
        1
  •  4
  •   JaredPar    17 年前

    根据您提供的信息,在该位置显然不可能出现空引用。因此,下一个问题是“如何知道特定行正在创建NullReferenceException?”您使用的是调试器还是堆栈跟踪信息?您正在检查代码的零售版本还是调试版本?

    如果是调试器,各种设置组合基本上会导致调试器 显得 在其他位置报告NullRef。要做到这一点,最主要的是“仅我的代码”设置。

    1. 通过调试编译
    2. 在调试器窗口中检查StackTrace属性
        2
  •  2
  •   nbevans    17 年前

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

    “PacketReader”可能暗示你不需要。因为,从技术上讲,如果你这么做了,它会被称为“框架阅读器”或类似的东西。

        3
  •  2
  •   tvanfosson    17 年前

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

    编辑 : 你查过了吗 m_CurrentCommand ProcessCommandAcknowledgment ?

        4
  •  1
  •   Mark Brackett    17 年前

    其他线程在做什么?

    编辑:您提到服务器是单线程的,但另一条评论建议 这部分

        5
  •  1
  •   leppie    17 年前

    如果您启用了优化,那么很可能会将您指向一个非常错误的地方,在那里它实际上发生了。

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

        6
  •  1
  •   Joshua    17 年前

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

        7
  •  1
  •   Charlie Martin    17 年前

    看着它,我非常怀疑堆栈正在损坏,导致您的 computer 自动被弄坏。检查子例程/方法/函数调用

        8
  •  1
  •   FlySwat    17 年前

    computer.processCommandAcknowledgement(commandType);

    您是否有调试符号,以便能够单步执行此操作?

    ProcessCommandAcknowledge可能会引发null ref异常,并冒泡。