为什么 GetServer() 方法返回空值
本文关键字:返回 空值 方法 GetServer 为什么 | 更新日期: 2023-09-27 17:57:10
今天我遇到了一些我编写的代码的问题,真的不知道我哪里出了问题,我会保持简短和甜蜜基本上Faze类中的GetServer()方法返回null,我真的不确定为什么,但我希望你们能帮助我。
我在下面留下了一些代码片段,列出了该问题涉及的每个类以及最初调用的位置,以便您更好地了解哪里出了问题。
程序.cs入口点..
static void Main(string[] args)
{
XmlConfigurator.Configure();
Faze.run();
while (true)
Console.ReadKey();
}
法兹类
public static class Faze
{
private static FazeServer fazeServer;
public static void run()
{
Console.Title = "Loading...";
fazeServer = new FazeServer("");
}
public static FazeServer GetServer()
{
return fazeServer;
}
}
法泽服务器类
public sealed class FazeServer
{
private ConsoleWorker consoleWorker;
public FazeServer(string lol)
{
LoadServer();
}
private void LoadServer()
{
consoleWorker = new ConsoleWorker();
classLogger.Info("Server has been loaded.");
}
}
控制台工作线程类
class ConsoleWorker : IDisposable
{
private readonly Timer consoleWorkerTimer;
private readonly int consoleWorkerInterval;
private static ILog classLogger;
public ConsoleWorker()
{
if (Faze.GetServer() == null)
throw new Exception("Server null..");
consoleWorkerInterval = int.Parse(Faze.GetServer().GetConfig().GetConfigElement("console.worker.interval"));
consoleWorkerTimer = new Timer(TimerElapsed, null, TimeSpan.FromMilliseconds(consoleWorkerInterval), TimeSpan.FromMilliseconds(consoleWorkerInterval));
classLogger = LogManager.GetLogger(typeof(ConsoleWorker));
}
private void TimerElapsed(object timerObject)
{
// Do something...
}
public void Dispose()
{
consoleWorkerTimer.Dispose();
}
}
按照跟踪后,中断它的代码是我的空检查
if (Faze.GetServer() == null)
throw new Exception("Server null..");
在我添加 if 语句之前,导致异常的行是
consoleWorkerInterval = int.Parse(Faze.GetServer().GetConfig().GetConfigElement("console.worker.interval"));
为什么 GetServer() 返回空值,有人可以帮忙吗?
我在喝几杯啤酒,但在"Faze"类中,您已经实现了一个静态字段:"fazeServer"并且没有为其赋值 - 因此它是空的。如果您想为"fazeServer"静态字段赋值,请在示例中为"Faze"类实现静态构造函数 - 例如:"static Faze() { fazeServer = new FazeServer("whatEverString");}'
这应该解决 NRE。
问候
P.Sz。
类字段初始化为 null,因此您的代码等效于:
public static class Faze
{
private static FazeServer fazeServer = null;
public static FazeServer GetServer() => fazeServer;
}
当然,调用 GetServer() 将返回 null 的未标记值。
如果要自己初始化它,请使用静态构造函数:
public static class Faze
{
private static FazeServer fazeServer;
static Faze()
{
fazeServer = new FazeServer("");
}
}
或字段初始值设定项:
public static class Faze
{
private static FazeServer fazeServer = new FazeServer("");
}
因此,可以肯定的是,当您调用 GetServer() 时,您将获得一个实例。
fazeServer
静态变量中设置值之前调用GetServer()
。
调用堆栈如下所示:
fazeServer = new FazeServer(");
- LoadServer();
- - consoleWorker = new ConsoleWorker();
- - - if (Faze.GetServer() == null)
或者,用简单的英语:
-
fazeServer
设置为返回值new FazeServer()
-
new FazeServer()
内部调用LoadServer()
-
LoadServer()
内部调用new ConsoleWorker()
-
new ConsoleWorker()
内部调用Faze.GetServer()
-
Faze.GetServer()
返回当前值fazeServer
因此,设置该静态变量的代码在完成设置之前在内部尝试读取该静态变量。