为什么我在以这种方式访问​​我的精灵成员时遇到exception?

我得到一个NullReferenceException错误,我做new Vector2(...)

我认为问题在于我使用的variables,即使他们正在控制玩家精灵,所以他们肯定不能为空,对吗? 然而,这是一个不同的阶级,并在这个顶部初始化。

这是有问题的方法:

 public void Shoot() { //if bullet delay resets then shoot if (bulletDelay >= 0) bulletDelay--; //if bullet delay is 0 then create a bullet at player bulletPosition if (bulletDelay <= 0) { //Here I create the new bullet passing in the texture and then modifying the bulletPosition were the bullet will appear from bullets newBullet = new bullets(); bulletPosition = new Vector2(mySprite.imgX, mySprite.imgY); newBullet.isVisible = true; //These two lines mean that you can have no more that 20 bullets on screen at once if (bulletList.Count < 20) { bulletList.Add(newBullet); } } //reset bullet delay if (bulletDelay == 0) bulletDelay = 10; } 

bulletDelay是这样的,玩家不能垃圾邮件发送button,太容易了。 我尝试在该行上添加一个断点,当我运行该程序并点击运行Shoot()方法的空格键时,程序停止并告诉我有关该错误的信息。 当我hover,但仍然说他们是空的。

我有以下代码中的类的实例。 我已经改变了,所以他们在Shoot()方法,似乎都很好,但我很好奇,为什么下面的代码不是正确的方法来做到这一点:

 public void Initialize() { mySprite = new PlayerSprite(); bulletList = new List<bullets>(); } 

有问题的行上唯一可能的子expression式( bulletPosition = new Vector2(mySprite.imgX, mySprite.imgY) )在mySprite的访问中,这意味着当执行该expression式时, mySprite为null。

即使你可能会在你的程序中的其他地方看到代码初始化一个名为mySprite的variables,但是由于以下原因(或更多)可能无法解决问题:

  • mySprite可能是一个完全不同于你当前访问的mySpritevariables。
  • 该variables可能是同一个类成员,但是您可能正在初始化该类的一个实例,而不是另一个,并且当为后一个实例调用Shoot时发生崩溃。
  • 代码可能正在初始化适当的实例的适当的variables,但从来没有因为某种原因被调用。

等等。 实际上有几个原因可能会发生,而在所有的可能性中走路并不是真的可行。

正确的解决scheme是确保mySprite在访问之前是非空的。 达到该解决scheme的方法是学习如何使用debugging器来执行诸如设置断点之类的事情, 检查variables的状态 ,以及了解代码的上下文以及对象和types之间的差异。