for循环的空引用

时间:2013-04-16 16:39:13

标签: c#

此代码:

public void collide(int x, int y)
{
   int foodthen=0;
   for(int xt=0;xt<150;xt++)
   {
      for(int  yt=0;yt<55;yt++)
      {
~        if(MainClass.tilesSet[yt,xt].food=true)
         {
            foodthen++;
         }
      }
   }
   Debug.WriteLine("Food then: "+foodthen);
   if(this.Equals(MainClass.fridge)||this.Equals(MainClass.tree))
   {
      if(MainClass.tilesSet[y,x].food)
      {
         MainClass.tilesSet[y,x].food=false;
         MainClass.Log("You found some food!");
         MainClass.player.food++;
      }

      else
      {
         MainClass.Log("There is no food... :(");
      }
    }
    MainClass.player.updateFood();
 }

这会在标有“〜”的行处抛出NullReferenceException。与标有“#”的行中相同的代码似乎没问题,当我在没有抛出代码的情况下测试它时没有抛出异常。为什么它只在for循环中发生?

3 个答案:

答案 0 :(得分:4)

MainClassMainClass.tilesSetMainClass.tilesSet[yt,xt]为空;

Use the visual studio debugger在该行上设置一个断点,以查看它是哪一个

答案 1 :(得分:2)

这意味着MainClassMainClass.tilesSetMainClass.tilesSet[yt,xt]null。假设MainClass实际上是一个类,它不能是null,所以很可能是另外两个中的一个。我最好的猜测是多维数组没有完全初始化,并且包含一些空引用。发生异常时,请使用ytxt的调试器to inspect the value

如果ytxt均为0,则MainClass.tilesSetMainClass.tilesSet[0,0]为空。对于任何其他值,数组未完全填充是一个问题。

此外,请注意,在该行代码中,您 true分配给属性(或字段)food,而不是检查true 。这很可能不是你想要的。

if(MainClass.tilesSet[yt,xt].food=true)

应该是:

if(MainClass.tilesSet[yt,xt].food)

答案 2 :(得分:0)

如果您收到NullReferenceException,则表示tilesSet数组尚未初始化。如果循环引用了超出范围的索引,那么你会得到一个异常,但是你得到的异常就是告诉你要求的数组对象不存在。

我会看看MainClass的属性是如何在调用collide方法的上下文中初始化的。