2011-12-21 3 views
0

Я разрабатываю небольшую RTS в C# (с XNA).Как сравнить два Hashtables

Я устанавливаю каждое положение «goto» как вектор, которому они должны идти. Все работает нормально, если я не сравниваю два Hashtables, но когда я это делаю, я получаю эту «необработанную ошибку 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

+1

Пожалуйста, покажите трассировку стека в 'NullReferenceException'. Это должно четко указывать, где ваша нулевая ссылка. –

+0

Я бы предположил, что 'selectedunits [I +" ID "]' равно null. Пройдите через Visual Studio и проверьте значение во время выполнения. – Polynomial

ответ

0

К сожалению, информации здесь недостаточно. Один из ваших ссылочных типов, которые вы используете в своей строке кода, является нулевым на момент выполнения. То, что вы можете сделать, это установить точку останова на этой строке и выполнить в режиме отладки. Когда поток выполнения попадает в эту строку, вы можете проверить все используемые вами ссылки, чтобы узнать, какой из них является нулевым, а затем диагностировать, почему это пусто.

  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

Там нет проблемы в хэш-таблице значений Comparision вы предоставили. Там есть некоторые проблемы с кастингом и некоторыми общими проектами. Я полагаю, что вы получили такое исключение при попытке передать значение null в float/int, чтобы избежать таких проблем, используйте метод Hashtable.ContainsKey(), чтобы проверить, существует ли данный ключ в хеш-таблице, и только затем получает его значение. Не забудьте проверить значение null перед произведением. Также вы можете использовать общий тип IDictionary<string, float> (see MSDN), чтобы все значения были напечатаны, и вам не нужно явно указывать, это также даст некоторые преимущества при создании, поскольку больше нет бокса для типов значений, например, в вашем примере float -> object, когда хранятся значения и object -> float (распаковывание) при возврате и отливке.

+0

Спасибо! Проверка того, содержит ли Hashtable ключ сначала, предотвращает эту ошибку, однако похоже, что это немного странно, но я уверен, что это ошибка моего кода. –

+0

Вот еще сообщение о сравнении хеш-таблицы http://stackoverflow.com/a/8532525/485076 – sll