Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从基类获取值时出现空引用异常_C#_.net_Exception Handling_Xna - Fatal编程技术网

C# 从基类获取值时出现空引用异常

C# 从基类获取值时出现空引用异常,c#,.net,exception-handling,xna,C#,.net,Exception Handling,Xna,我有一个小引擎(定义为公共类屏幕管理器:DrawableGameComponent)来管理输入和屏幕(带有转换等),它使用公共抽象类GameScreen。对于菜单屏幕,我有一个抽象类MenuScreen:GameScreen。 我试图从类选项MenuScreen:MenuScreen中获取一个存储在游戏主类(Program.cs调用的类)中的值,但我总是得到NullReferenceException。我需要这个值,因为在启动应用程序时,我需要获得一些选项,这些选项可以从选项菜单屏幕更改,但我希

我有一个小引擎(定义为
公共类屏幕管理器:DrawableGameComponent
)来管理输入和屏幕(带有转换等),它使用
公共抽象类GameScreen
。对于菜单屏幕,我有一个
抽象类MenuScreen:GameScreen
。 我试图从
类选项MenuScreen:MenuScreen
中获取一个存储在游戏主类(Program.cs调用的类)中的值,但我总是得到NullReferenceException。我需要这个值,因为在启动应用程序时,我需要获得一些选项,这些选项可以从选项菜单屏幕更改,但我希望该屏幕的更改自动反映在应用程序的其余部分,因此屏幕可以基于该值进行计算,不强制用户重新加载整个应用程序以更新主类中的值。 我这样做是因为

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;
}
我总是得到NullReferenceException。尽管它可以从其他屏幕(直接从GameScreen派生,而不是MenuScreen)工作


有什么想法吗?

您的代码中有两个可能性,要么
ScreenManager
为空,要么
(ScreenManager.GameInstance为主)
为空


对于第一种情况: 我认为您是从选项屏幕的构造函数中调用问题行,或者至少是在调用screenmanager的
AddScreen
方法之前

将其移动到屏幕的
LoadContent
方法

对于第二种情况: 检查
GameInstance
是否为
Main
的实例



值得注意的是,这是您代码的基础。

是否使用了
((Main)ScreenManager.GameInstance)。SeparateAxis
?您知道
as
是如何工作的吗?编写
(以ScreenManager.GameInstance为主)。SeparateAxis
而不是
((主)ScreenManager.GameInstance)。SeparateAxis
会带来这种麻烦。相关:您何时调用问题行,它是否在屏幕的constructor中,在这种情况下,screenmanager将不会被分配一个值。它与(Main)也不起作用,事实上这是我第一次尝试。即使我将该行移到构造函数之外,在另一种方法中,它总是在ScreenManagerYes上给出异常,我将该引擎应用到我的应用程序中。是的,GameInstance是Main的一个实例(实际上Main是Game类型的,GameInstance显然也是)。但也尝试将其放入其中一个事件(默认情况下它不在那里,如果它提供服务,我可以添加)中,它会给出相同的异常…在代码行上放置一个断点。将光标悬停在屏幕管理器上。它是空的吗?将鼠标悬停在
上作为
,该表达式是否为空?覆盖
选项屏幕
中的
游戏屏幕
加载内容
方法,并将代码放在那里。这应该行得通。
separateAxis = (ScreenManager.GameInstance as Main).SeparateAxis;