从基类获取值的空引用异常

本文关键字:引用 异常 基类 获取 | 更新日期: 2023-09-27 18:14:33

我有一个小引擎(定义为public class ScreenManager : DrawableGameComponent)来管理输入和屏幕(带有过渡等),谁与public abstract class GameScreen一起工作。对于菜单屏幕,我有一个abstract class MenuScreen : GameScreen。我试图从class OptionsMenuScreen : MenuScreen获得存储在游戏主类中的值(由Program.cs调用),但我总是得到NullReferenceException。我需要这个值,因为在启动应用程序时,我需要获得一些选项,这些选项可以从OptionsMenuScreen中更改,但我希望从该屏幕的更改自动反映到应用程序的其余部分,所以屏幕可以基于该值计算,而不强制用户重新加载整个应用程序以获取主类更新的值。我用

public ScreenManager ScreenManager
{
    get { return screenManager; }
    internal set { screenManager = value; }
}
ScreenManager screenManager;

/// <summary>
/// Adds a new screen to the screen manager.
/// </summary>
public void AddScreen(GameScreen screen, PlayerIndex? controllingPlayer)
{
    screen.ControllingPlayer = controllingPlayer;
    screen.ScreenManager = this;
    screen.IsExiting = false;
    // If we have a graphics device, tell the screen to load content.
    if (isInitialized)
    {
        screen.LoadContent();
    }
    screens.Add(screen);
    // update the TouchPanel to respond to gestures this screen is interested in
    TouchPanel.EnabledGestures = screen.EnabledGestures;
}

作为向ScreenManager的屏幕列表中添加屏幕的方法。但是当我尝试写

separateAxis = (ScreenManager.GameInstance as Main).SeparateAxis;

我总是得到NullReferenceException。尽管它可以在其他屏幕上工作(直接来自GameScreen,而不是MenuScreen)。

任何想法?

从基类获取值的空引用异常

您的代码有2种可能性,ScreenManager为空,或(ScreenManager.GameInstance as Main)为空。


对于第一种情况:

我认为你是从选项屏幕的构造函数中调用你的问题行,或者至少在屏幕管理器的AddScreen方法被调用之前。

移动到屏幕的LoadContent方法

第二种情况:

检查GameInstance是否为Main的一个实例


值得注意的是,这是你的代码所基于的gamestatmanagement样本。