You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Game构造函数初始化后QuestGUI的Player属性仍返回null?

问题原因及解决方案

核心原因:代码执行顺序导致Player赋值晚于访问时机

你遇到的NullReferenceException是因为QuestGUI的Player属性在被访问时还没完成赋值。

看你的Game构造流程:

  1. 创建main_player实例
  2. 创建QuestHub、QuestGUI、QuestHubGUI
  3. 最后才给QuestGUI.Player赋值

如果在步骤2创建QuestGUI或QuestHubGUI的过程中,内部逻辑(比如QuestHub.DisplayResult或者相关回调)已经触发了QuestGUI里的奖励代码(也就是你调用Player.GenerateItem()的那段逻辑),这时候Player还没被赋值,自然会抛出空引用异常。

另外还有两种可能的次要原因:

  • 你在其他地方额外new了一个QuestGUI实例,而这个实例的Player属性从未被赋值
  • Game类中的QuestGUI字段和类名重名(虽然C#允许,但可能导致意外的实例混淆)

最直接的解决方案:构造时传入Player

修改QuestGUI的构造函数,让它在创建时就接收Player参数,从根源避免未赋值的情况:

修改QuestGUI类:

// 可以把属性改成只读(如果不需要后续修改Player实例)
public Player Player { get; }
public QuestHub QuestHub { get; }

public QuestGUI(QuestHub questHub, Player player)
{
    QuestHub = questHub;
    Player = player; // 构造时直接初始化Player
}

修改Game构造函数:

public Game()
{
    Item[] initialItems = new Item[]
    {
        new Weapon("Sword", 10),
    };
    main_player = new Player("Omegar", 100, initialItems);

    Quest[] quests = new Quest[]
    {
        new Quest(...),
    };

    QuestHub questHub = new QuestHub(quests);
    // 创建QuestGUI时直接传入Player
    QuestGUI = new QuestGUI(questHub, main_player);
    QuestHubGUI = new QuestHubGUI(questHub);

    // 这里不需要再赋值Player了
    // QuestGUI.Player = main_player;
}

其他排查方向

如果坚持要保留原构造方式,需要:

  1. 检查QuestHub或QuestHubGUI的构造/初始化逻辑,有没有在创建时就触发QuestGUI里的奖励代码,有的话要延迟触发到Player赋值完成之后
  2. 确认所有用到的QuestGUI实例都是Game类中创建的那个,没有其他地方额外new未赋值的实例

内容的提问来源于stack exchange,提问作者the_dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:35:11