NullReference at forloop

本文关键字:forloop at NullReference | 更新日期: 2023-09-27 18:09:34

代码:

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

NullReference at forloop

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

使用visual studio调试器在该行上设置一个断点,以查看它是哪一个

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

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

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

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

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

如果你得到一个NullReferenceException,那么这将表明tilesSet数组尚未初始化。如果循环引用的索引超出了作用域,你会得到一个异常,但是你得到的异常是告诉你,你正在请求一个不存在的数组对象。

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