-4

这段代码:

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 循环中?

4

3 回答 3

4

要么MainClassMainClass.tilesSet要么MainClass.tilesSet[yt,xt]为空;

使用 Visual Studio 调试器在该行上放置一个断点以查看它是哪一个

于 2013-04-16T16:43:40.310 回答
2

这意味着MainClassMainClass.tilesSet或者MainClass.tilesSet[yt,xt]null。假设MainClass实际上是一个类,它不可能是null,所以很可能是其他两个中的一个。我最好的猜测是多维数组没有完全初始化,它包含一些空引用。使用调试器检查异常的值和发生时间ytxt

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

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

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

应该:

if(MainClass.tilesSet[yt,xt].food)
于 2013-04-16T16:46:34.480 回答
0

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

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

于 2013-04-16T16:45:28.707 回答