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循环中发生?
MainClass
, MainClass.tilesSet
或MainClass.tilesSet[yt,xt]
为空;
使用visual studio调试器在该行上设置一个断点,以查看它是哪一个
表示MainClass
、MainClass.tilesSet
或MainClass.tilesSet[yt,xt]
为null
。假设MainClass
实际上是一个类,它不可能是null
,所以很可能是其他两个中的一个。我最好的猜测是多维数组没有完全初始化,其中包含一些空引用。当出现异常时,使用调试器检查yt
和xt
的值
如果yt
和xt
均为0,则MainClass.tilesSet
或MainClass.tilesSet[0,0]
为空。对于任何其他值,这是一个没有完全填充数组的问题。
另外,请注意,在那行代码中,您将将 true
分配给属性(或字段)food
,而不是检查true
。这很可能不是你想要的。
if(MainClass.tilesSet[yt,xt].food=true)
应:if(MainClass.tilesSet[yt,xt].food)
如果你得到一个NullReferenceException
,那么这将表明tilesSet
数组尚未初始化。如果循环引用的索引超出了作用域,你会得到一个异常,但是你得到的异常是告诉你,你正在请求一个不存在的数组对象。
我会看看MainClass
的属性是如何在collide
方法被调用的上下文中初始化的