2011-12-21 168 views
0

我在C#開發小RTS(用XNA)。如何比較兩個哈希表

我設置各單位「轉到」位置,因爲他們應該去的載體。如果我不比較兩個哈希表,一切正常,但當我這樣做,我得到這個「NullReferenceException是未處理」惱人的錯誤。

這裏是我得到的錯誤的代碼段:

if (
    ((float)unit[(int)selectedunits[I+"ID"] + "posX"] != 
    (float)cgoto[(int)selectedunits[I+"ID"] + "X"]) 
    && 
    ((float)unit[(int)selectedunits[I+"ID"] + "posY"] != 
    (float)cgoto[(int)selectedunits[I+"ID"] + "Y"]) 
    ) 

希望這是不夠具體。

+0

如何單元,selectedunits和cgoto界定? – Joe 2011-12-21 14:12:05

+1

請顯示'NullReferenceException'的堆棧軌跡。這應該高亮顯示你的空引用的位置。 – 2011-12-21 14:12:16

+0

我想'selectedunits [I +「ID」]'爲空。請逐步使用Visual Studio並在運行時檢查值。 – Polynomial 2011-12-21 14:12:29

回答

0

可悲的是,沒有足夠的信息去這裏的。在您的代碼行中使用的其中一種參考類型在執行時爲null。你可以做的是在該行設置一個斷點,並在調試模式下執行。當執行流擊中該行時,您可以檢查您正在使用的所有引用,以查看哪一個引用爲空,然後從那裏診斷其爲空的原因。

  1. http://msdn.microsoft.com/en-us/library/system.nullreferenceexception.aspx
  2. http://msdn.microsoft.com/en-us/library/490f96s2.aspx
  3. http://msdn.microsoft.com/en-us/library/9kkx3h3c.aspx
0

有沒有在哈希表值的問題比較您提供。有一些鑄造問題和一些一般的設計要點。我相信,當試圖施放空到float/int,以避免此類問題使用Hashtable.ContainsKey()方法檢查給定鍵是否在哈希表中存在,然後才存取權限它的價值,你有這樣的例外。不要忘記在投射之前檢查null的值。你也可以考慮使用一般的類型化IDictionary<string, float>see MSDN),因此所有的值會打字,你並不需要顯式轉換,這也將在你的例子給一些perfromance收益,因爲沒有更多的拳擊值類型,如float -> object當存儲值和object -> float(取消裝箱)當檢索回來和投。

+0

謝謝!檢查Hashtable是否包含Key先防止這個錯誤,然而它看起來像有點奇怪,但我敢肯定這是我的代碼的錯誤。 – 2011-12-21 14:37:50

+0

這是另一篇關於散列表比較的文章http://stackoverflow.com/a/8532525/485076 – sll 2011-12-21 17:49:27