Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么GetServer()方法返回null?_C# - Fatal编程技术网

C# 为什么GetServer()方法返回null?

C# 为什么GetServer()方法返回null?,c#,C#,今天我遇到了一个问题,我写了一些代码,真的不知道哪里出了问题,我会保持简短,基本上Faze类中的GetServer()方法返回null,我真的不知道为什么,但我希望你们能帮我解决这个问题 我在下面留下了一些代码片段,介绍了这个问题中涉及的每个类及其最初调用的位置,以便更好地了解哪里出了问题 Program.cs入口点 static void Main(string[] args) { XmlConfigurator.Configure(); Faze.run(); wh

今天我遇到了一个问题,我写了一些代码,真的不知道哪里出了问题,我会保持简短,基本上Faze类中的GetServer()方法返回null,我真的不知道为什么,但我希望你们能帮我解决这个问题

我在下面留下了一些代码片段,介绍了这个问题中涉及的每个类及其最初调用的位置,以便更好地了解哪里出了问题

Program.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;
    }
}
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()
  • Faze.GetServer()
    返回fazeServer的当前值

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

首先调用Faze.run()初始化fazeServer,否则fazeServer不会初始化且为null。因为您在
fazeServer
的构造函数中调用
GetServer
。此时
Faze.fazeServer
变量为
null