为何Game构造函数初始化后QuestGUI的Player属性仍返回null?
问题原因及解决方案
核心原因:代码执行顺序导致Player赋值晚于访问时机
你遇到的NullReferenceException是因为QuestGUI的Player属性在被访问时还没完成赋值。
看你的Game构造流程:
- 创建
main_player实例 - 创建
QuestHub、QuestGUI、QuestHubGUI - 最后才给
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; }
其他排查方向
如果坚持要保留原构造方式,需要:
- 检查
QuestHub或QuestHubGUI的构造/初始化逻辑,有没有在创建时就触发QuestGUI里的奖励代码,有的话要延迟触发到Player赋值完成之后 - 确认所有用到的
QuestGUI实例都是Game类中创建的那个,没有其他地方额外new未赋值的实例
内容的提问来源于stack exchange,提问作者the_dev
相关产品推荐
相关产品推荐

