C# 为什么GetServer()方法返回null?
今天我遇到了一个问题,我写了一些代码,真的不知道哪里出了问题,我会保持简短,基本上Faze类中的GetServer()方法返回null,我真的不知道为什么,但我希望你们能帮我解决这个问题 我在下面留下了一些代码片段,介绍了这个问题中涉及的每个类及其最初调用的位置,以便更好地了解哪里出了问题 Program.cs入口点C# 为什么GetServer()方法返回null?,c#,C#,今天我遇到了一个问题,我写了一些代码,真的不知道哪里出了问题,我会保持简短,基本上Faze类中的GetServer()方法返回null,我真的不知道为什么,但我希望你们能帮我解决这个问题 我在下面留下了一些代码片段,介绍了这个问题中涉及的每个类及其最初调用的位置,以便更好地了解哪里出了问题 Program.cs入口点 static void Main(string[] args) { XmlConfigurator.Configure(); Faze.run(); wh
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;
}
}
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.");
}
}
ConsoleWorker类
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()返回null,有人能帮忙吗?我想喝几杯啤酒,但在“Faze”类中,您实现了一个静态字段:“fazeServer”,并且没有给它赋值-因此它是null。 如果要为“fazeServer”静态字段赋值,请在示例中为类“Faze”实现静态构造函数-在示例中:' 静态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("");
}
因此,在
fazeServer
静态变量中设置值之前,当您调用GetServer()调用GetServer()
时,您肯定会得到一个实例
调用堆栈如下所示:
fazeServer=新的fazeServer(“”)-LoadServer()
--consoleWorker=新的consoleWorker()
---if(Faze.GetServer()==null) 或者,简单地说:
设置为fazeServer
new fazeServer()
内部调用newfazeserver()
LoadServer()
内部调用LoadServer()
newconsoleworker()
内部调用newconsoleworker()
Faze.GetServer()
返回fazeServer的当前值Faze.GetServer()
因此,设置该静态变量的代码正在内部尝试在完成设置之前读取该静态变量。首先调用Faze.run()初始化fazeServer,否则fazeServer不会初始化且为null。因为您在
fazeServer
的构造函数中调用GetServer
。此时Faze.fazeServer
变量为null