簡體   English   中英

奇怪的空引用異常

[英]Strange nullreference exception

因此,我有這段代碼負責處理來自遠程計算機的命令確認,有時(例如每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();
        }
    }

根據您提供的信息,在該位置肯定不會出現null引用。 因此,下一個問題是“您如何知道特定行正在創建NullReferenceException?” 您是否正在使用調試器或堆棧跟蹤信息? 您要檢查代碼的零售版還是調試版?

如果它的調試器,各種設定組合,這基本上可以導致調試出現在不同的地方,報告NullRef。 這樣做的主要目的是“我的代碼”設置。

根據我的經驗,我發現確定異常發生的最可靠方法是...

  1. 關閉JMC
  2. 使用調試進行編譯
  3. 調試器->設置->拋出CLR異常中斷。
  4. 在調試器窗口中檢查StackTrace屬性

ReadString()是否有可能返回null? 這將導致GetType失敗。 也許您收到了一個空包? 或者,字符串可能與類型不匹配,因此當以后使用時,commandType將為null。

編輯 :您是否在調用ProcessCommandAcknowledgment時檢查m_CurrentCommand是否為null?

我敢打賭,您的TCP框架代碼有問題(如果有的話!)

“ PacketReader”可能表明您不這樣做。 因為從技術上講,它將被稱為“ FrameReader”或類似的名稱。

如果涉及的兩台PC位於本地LAN或其他設備上,則可能可以解釋14天的間隔。 如果您通過Internet嘗試此操作,我敢打賭您的錯誤頻率會更加普遍,尤其是在爭用WAN帶寬的情況下。

如果您啟用了優化功能,則可能會將您引向實際發生錯誤的位置。

幾年前,我也發生了類似的事情。

否則可能是某個線程在其他線程將上下文設置為null的地方發生了種族競爭。 那也將解釋錯誤的罕見。

好的,那實際上只是少數可能性。

  1. 調用該例程時,某種程度上您的計算機參考已被破壞。

  2. 該調用下的某些操作引發了空指針取消引用錯誤,但在該行被檢測到。

看着它,我非常懷疑堆棧已損壞,導致您的computer自動損壞。 檢查你身邊有困難的一個子程序/方法/函數調用; 尤其要檢查您制作的“計算機”項是否確實是您期望的類型。

其他線程在做什么?

編輯:您提到服務器是單線程的,但是另一條評論表明該部分是單線程的。 如果是這種情況,您仍然可能存在並發問題。

我認為,最重要的是您遇到了多線程問題或CLR錯誤。 您可以猜測我認為哪一種可能性更大。

computer.ProcessCommandAcknowledgment(commandType);

您是否有調試符號可以進入?

可以通過ProcessCommandAcknowledgement引發null ref異常,然后冒泡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM