因此,我正在开发一个基于文本的游戏,并且我遇到了一个问题,即在运行时没有正确地填充对象。我不完全确定为什么会发生这种情况,但下面是代码:
public class Area
{
public List<Area> options;
public string name;
public string text;
public uint time;
private void loadOptions()
{
MainWindow.app.options.Children.Clear();
for(int i = 0; i < options.Count(); i++)
{
Button b = new Button();
b.Content = options[i].name;
b.Name = "b"+i;
b.Click += new RoutedEventHandler(optionClick);
MainWindow.app.options.Children.Add(b);
}
}
private void optionClick(object sender, EventArgs e)
{
Button clicked = (Button)sender;
int index = Int32.Parse(clicked.Name.Split('b')[1]);
options[index].load();
}
public void load()
{
loadOptions();
MainWindow.app.mainText.SelectAll();
MainWindow.app.mainText.Selection.Text = text;
}
}
这是Area类的逻辑部分,我将所有其他区域保存在一个单独的文件中,放在一个areas类中,如下所示:
public static class Areas
{
public static Area opening = new Area()
{
name = "Opening",
text = "This is the first area, just a test for now, but will be fully filled out at a later time",
time = 0,
options = new List<Area>()
{
second
}
};
public static Area second = new Area()
{
name = "second",
text = "this is the second area for stuffs and stuffs",
time = 0,
options = new List<Area>()
{
opening
}
};
}
两者都是同一名称空间的一部分,但为了可读性,它们位于不同的文件中。其想法是,选项数组包含玩家可以从该菜单转到的所有可能的菜单。第一个测试区域的代码如下:
public Area test = new Area()
{
text = "This is yet another test to test stuffs and things and places",
time = 0,
options = new List<Area>
{
Areas.opening
}
};
这将正确加载,但只要我单击按钮,整个程序就会崩溃并抛出一个空引用异常。
以下是错误的详细信息:
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=LostWorlds
StackTrace:
at LostWorlds.Area.loadOptions() in C:\Users\Max\source\repos\LostWorlds\LostWorlds\LostWorlds\MainWindow.xaml.cs:line 356
at LostWorlds.Area.load() in C:\Users\Max\source\repos\LostWorlds\LostWorlds\LostWorlds\MainWindow.xaml.cs:line 373
at LostWorlds.Area.optionClick(Object sender, EventArgs e) in C:\Users\Max\source\repos\LostWorlds\LostWorlds\LostWorlds\MainWindow.xaml.cs:line 368
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
at System.Windows.Controls.Primitives.ButtonBase.OnClick()
at System.Windows.Controls.Button.OnClick()
at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at System.Windows.Application.Run()
at LostWorlds.App.Main()
从我收集的信息来看,用静态类区域中的对象填充区域的选项列表有一些问题,每当我查看列表的值时,它都有一个条目为空。
发布于 2018-06-01 05:38:14
我意识到这是一个提升的问题,因为在声明"second“之前,"opening”引用了"second“,"opening”没有任何东西来填充自己,因此返回了一个空引用。因此,解决方案如下所示:
public static Area second = new Area()
{
name = "second",
text = "this is the second area for stuffs and stuffs",
time = 0,
options = new List<Area>()
{
opening
}
};
public static Area opening = new Area()
{
name = "Opening",
text = "This is the first area, just a test for now, but will be fully filled out at a later time",
time = 0,
options = new List<Area>()
{
second
}
};
还不能完全确定如何使引用循环,但我确信我可以弄清楚。
https://stackoverflow.com/questions/50632953
复制相似问题