2011-12-21 10 views
0

C#で小さなRTSを開発中です(XNAを使用)。2つのハッシュテーブルの比較方法

私は各ユニットの "goto"ポジションを移動先のベクトルとして設定しています。私は2つのハッシュテーブルを比較しないとすべてうまく動作しますが、そうすると、この "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

unit、selectedunits、およびcgotoはどのように定義されていますか? – Joe

+1

'NullReferenceException'のスタックトレースを表示してください。これは、null参照がどこにあるのかを正確に強調する必要があります。 –

+0

私は 'selectedunits [I +" ID "]'がnullだと思います。 Visual Studioを使い、実行時に値を確認してください。 – Polynomial

答えて

0

悲しいことに、ここには十分な情報がありません。コード行で使用している参照型の1つは、実行時にはnullです。あなたができることは、その行にブレークポイントを設定し、デバッグモードで実行することです。実行の流れがその行に当たったら、使用しているすべての参照を検査して、どちらがnullであるのかを調べ、そこから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

あなたが提供してきた比較ですハッシュテーブルの値に問題はありません。キャスティングやいくつかの一般的な設計上の問題があります。そのような問題を避けるためにnullをキャストしようとしたときにnullをキャストしようとすると例外があると思います。Hashtable.ContainsKey()メソッドを使用して、指定されたキーがハッシュテーブルに存在し、その値にアクセスしたかどうかを確認します。キャストする前にヌルの値をチェックすることを忘れないでください。また、一般的なタイプのIDictionary<string, float>see MSDN)の使用を検討することができます。すべての値が入力され、明示的にキャストする必要はありません。これは、例のような値タイプのボクシングがなくなるので、いくつかのパフォーマンスを向上させます。float -> objectobject -> float(アンボクシング)。

+0

ありがとう!ハッシュテーブルにキーが含まれているかどうかを確認することで、このエラーを防ぐことができますが、動作が少し変わったように見えますが、私のコードの誤りであると確信しています。 –

+0

ハッシュテーブルの比較に関する他の投稿がありますhttp://stackoverflow.com/a/8532525/485076 – sll

関連する問題