[英]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。 這樣做的主要目的是“我的代碼”設置。
根據我的經驗,我發現確定異常發生的最可靠方法是...
ReadString()
是否有可能返回null? 這將導致GetType失敗。 也許您收到了一個空包? 或者,字符串可能與類型不匹配,因此當以后使用時,commandType將為null。
編輯 :您是否在調用ProcessCommandAcknowledgment
時檢查m_CurrentCommand
是否為null?
我敢打賭,您的TCP框架代碼有問題(如果有的話!)
“ PacketReader”可能表明您不這樣做。 因為從技術上講,它將被稱為“ FrameReader”或類似的名稱。
如果涉及的兩台PC位於本地LAN或其他設備上,則可能可以解釋14天的間隔。 如果您通過Internet嘗試此操作,我敢打賭您的錯誤頻率會更加普遍,尤其是在爭用WAN帶寬的情況下。
如果您啟用了優化功能,則可能會將您引向實際發生錯誤的位置。
幾年前,我也發生了類似的事情。
否則可能是某個線程在其他線程將上下文設置為null的地方發生了種族競爭。 那也將解釋錯誤的罕見。
好的,那實際上只是少數可能性。
調用該例程時,某種程度上您的計算機參考已被破壞。
該調用下的某些操作引發了空指針取消引用錯誤,但在該行被檢測到。
看着它,我非常懷疑堆棧已損壞,導致您的computer
自動損壞。 檢查你身邊有困難的一個子程序/方法/函數調用; 尤其要檢查您制作的“計算機”項是否確實是您期望的類型。
其他線程在做什么?
編輯:您提到服務器是單線程的,但是另一條評論表明該部分是單線程的。 如果是這種情況,您仍然可能存在並發問題。
我認為,最重要的是您遇到了多線程問題或CLR錯誤。 您可以猜測我認為哪一種可能性更大。
computer.ProcessCommandAcknowledgment(commandType);
您是否有調試符號可以進入?
可以通過ProcessCommandAcknowledgement引發null ref異常,然后冒泡。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.