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;