为什么 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() 返回空值,有人可以帮忙吗?

为什么 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

因此,设置该静态变量的代码在完成设置之前在内部尝试读取该静态变量。