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

时间:2011-11-15 11:00:10

标签: c# .net exception-handling xna

我有一个小引擎(定义为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;

在GameScreen.cs和

/// <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)。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的代码中有2个posibilies,ScreenManager为空,或(ScreenManager.GameInstance as Main)为。


对于第一种情况:

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

将其移至屏幕的LoadContent方法。

对于第二种情况:

检查GameInstanceMain的实例。


值得注意的是,这是基于您的代码的GameStateManagement sample