【问题标题】:C# NullReference Exception even when object set to an instanceC# NullReference 异常,即使对象设置为实例
【发布时间】:2015-05-24 00:19:47
【问题描述】:

我遇到了一个很奇怪的NullReferenceException。我使用new 关键字将对象设置为实例,但仍然抛出异常。这是我的代码:

游戏类

public class Game
{      
    public Game(Player playerParam) 
    {
        Player = playerParam;       
    }

    public Player Player;
    public int Duration = 60;
}

public class Player
{
   public Difficulty Difficulty;
   public string Name;
   public int Bonus;
}

现在我首先创建 Player 实例,然后在游戏开始时创建游戏并传入 Player。这按预期工作。但是我有另一个设置类,它的构造函数接受一个游戏对象并访问玩家来更改一些设置。我是这样做的:

public class Settings
{
    private Game game;
    public Settings(Game gameParam)
    {
        game = gameParam;
    }

    private void changeDifficulty(Difficulty difficulty)
    {
        game.Player.Difficulty = difficulty;
    }
}

线

game.Player.Difficulty = difficulty;

即使我传入 Settings 构造函数(一个已经初始化的 Game 对象),也会引发 NullReferenceException。进入代码我发现设置上的游戏对象(游戏)仍然为空。这里有什么问题

播放器是这样实例化的

Player player = new Player(); 

就在构造函数的正上方。

以下是其他详细信息。 我在 Game 之前实例化 Player,这是在主游戏 Form 上完成的。然后我将实例化的值传递给实际上是另一个 WinForm 的设置。当我将它传递给设置表单构造函数时,我进入代码并发现游戏被实例化。但是在设置表单上,游戏对象在访问时为空。

【问题讨论】:

  • 你离开了用非空玩家实例化游戏的部分
  • 你必须在改变难度之前调用设置构造函数。
  • 您能否向我们展示您创建播放器、游戏、设置等的代码以及它们是如何注入的。
  • 请显示您创建播放器的代码。应该类似于Player p = new Player;
  • 你确定你实例化播放器正确吗?请向我们展示更多代码

标签: c# instance nullreferenceexception


【解决方案1】:

问题很可能是您的Player 为空,这导致您尝试访问Difficulty 属性时出现空引用异常,而不是game 为空。

【讨论】:

  • "步入代码发现settings上的Game对象(游戏)依然为空"
  • @bonyjoe -- 是的,我看到了,但鉴于问题本身不够明确,我并不完全相信这一点。
  • 当我的程序第一次运行时,我像这样创建 Player 对象 Player player = new Player();它只是我在开始新游戏之前创建的游戏对象。
  • @bonyjoe “步入代码我发现设置上的游戏对象(游戏)仍然为空”已在此答案出现很久后添加到问题中。
猜你喜欢
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多