此代码:
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循环中发生?
答案 0 :(得分:4)
MainClass
,MainClass.tilesSet
或MainClass.tilesSet[yt,xt]
为空;
Use the visual studio debugger在该行上设置一个断点,以查看它是哪一个
答案 1 :(得分:2)
这意味着MainClass
,MainClass.tilesSet
或MainClass.tilesSet[yt,xt]
为null
。假设MainClass
实际上是一个类,它不能是null
,所以很可能是另外两个中的一个。我最好的猜测是多维数组没有完全初始化,并且包含一些空引用。发生异常时,请使用yt
和xt
的调试器to inspect the value。
如果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)
答案 2 :(得分:0)
如果您收到NullReferenceException
,则表示tilesSet
数组尚未初始化。如果循环引用了超出范围的索引,那么你会得到一个异常,但是你得到的异常就是告诉你要求的数组对象不存在。
我会看看MainClass
的属性是如何在调用collide
方法的上下文中初始化的。