我对此刻非常困惑。
我有以下课程:(只是课程的一部分):
public class GUIWindow
{
#region Static Fields
//The standard image for windows.
public static IngameImage StandardBackgroundImage;
#endregion
}
IngameImage只是我自己的一个类,但实际上它包含一个Texture2D(以及其他一些东西)。 在另一个类中,我通过反序列化XML文件来加载GUIButtons列表。
public static GUI Initializazion(string pXMLPath, ContentManager pConMan)
{
GUI myGUI = pConMan.Load<GUI>(pXMLPath);
GUIWindow.StandardBackgroundImage = new
IngameImage(pConMan.Load<Texture2D>(myGUI.WindowStandardBackgroundImagePath),
Vector2.Zero, 1024, 600, 1, 0, Color.White, 1.0f,
true, false, false);
System.Console.WriteLine("Image loaded? " +
(GUIWindow.StandardBackgroundImage.ImageStrip != null));
myGUI.Windows = pConMan.Load<List<GUIWindow>>(myGUI.GUIFormatXMLPath);
System.Console.WriteLine("Windows loaded");
return myGUI;
}
这一行:System.Console.WriteLine(“Image loaded?”+
(GUIWindow.StandardBackgroundImage.ImageStrip!= null));
打印“真实”。
要加载GUIWindows,我需要一个“空”构造函数,如下所示:
public GUIWindow()
{
Name = "";
Buttons = new List<Button>();
ImagePath = "";
System.Console.WriteLine("Image loaded? (In win) " +
(GUIWindow.StandardBackgroundImage.ImageStrip != null));
//Image = new IngameImage(StandardBackgroundImage);
//System.Console.WriteLine(
//Image.IsActive = false;
SelectedButton = null;
IsActive = false;
}
如您所见,我在构造函数中注释掉了行。因为:否则会崩溃。 这里是System.Console.WriteLine行(“Image loaded?(In win)”+ (GUIWindow.StandardBackgroundImage.ImageStrip!= null)); 不打印任何内容,它只是崩溃与以下错误消息:
构建内容引发NullReferenceException:对象引用未设置为对象实例。
为什么会这样? 在程序要加载List之前,它会打印“true”。但是在构造函数中,所以在加载列表时会打印“false”。 任何人都可以告诉我为什么会发生这种情况以及如何解决它?
答案 0 :(得分:2)
我对NullReferenceException的最佳猜测是GUIWindow.StandardBackgroundImage
为空,因此当您尝试访问GUIWindow.StandardBackgroundImage.ImageStrip
时会抛出此异常。
您熟悉Visual Studio调试器吗?如果不是,你应该是。我设置了一些断点并逐步执行任何读取或写入StandardBackgroundImage
的代码。
但是,真的,你的组织可以得到改善。为什么StandardBackgroundImage
是GUIWindow
类的静态字段?它应该是加载它的类的字段 - 无论Initialization
方法在哪里。然后将其传递给GUIWindow的构造函数。
您正在将StandardBackgroundImage
字段视为全局,因此感受到该决定的影响 - 有些东西正在阅读和修改它,而您无法跟踪它们正在执行的顺序。