C# NullReferenceException,但没有任何内容为 null

C# NullReferenceException but nothing is null

提问人:Abraham Murciano Benzadon 提问时间:7/24/2020 最后编辑:Abraham Murciano Benzadon 更新时间:7/24/2020 访问量:457

问:

我有一个 C# 类,其中包含如下所示的字段和属性。

public static class Config {
    // ...
    private static string admin_email;
    public static string AdminEmail {
        get {
            if (admin_email == null) {
                admin_email = config_xml.Element("admin_email").Value;
            //  ^ The exception is thrown here.
            }
            return admin_email;
        }
    }
}

在上面的代码中,是一个 XElement,它包含一个子元素,如下所示config_xml

<admin_email>[email protected]</admin_email>

但是,当我尝试访问此属性时,即使调试器显示没有任何内容为 null,我也会得到一个。NullReferenceException

我检查了调试器,并按预期显示电子邮件。config_xml.Element("admin_email").Value

奇怪的是,当我在那行上放置一个断点并一步一步地单步执行时,不会抛出异常。

我尝试过启用和不启用“只是我的代码”选项。

如果这有帮助,我尝试在这样的行上访问该属性(来自不同的项目)

message.From = new MailAddress(Config.AdminEmail);

编辑

将代码更改为此代码后,我意识到 c 仍然是 null。

get {
    if (admin_email == null) {
        XElement c = config_xml;
        XElement e = c.Element("admin_email");
    //  ^ Exception is now thrown here
        string v = e.Value;
        admin_email = v;
    }
    return admin_email;
}
C# 调试 异常 NullReferenceException

评论

4赞 David 7/24/2020
异常的堆栈跟踪是什么?也许它指向其他地方?如果在调试期间未发生异常,则可能存在计时问题。尝试在某处输出/记录每个值,并在引用每个值之前。如果该行再次抛出异常,则该日志输出应告诉您 .config_xmlconfig_xml.Element("admin_email")null
1赞 asawyer 7/24/2020
我想知道 xml 源是否未按预期加载,除非您在调试版本中。如果在读取 xml 源时没有抛出或记录,则在发生类似情况之前,您不会注意到。
1赞 Lasse V. Karlsen 7/24/2020
存储到自己的变量中并添加一个断点,我的猜测是这将在您的情况下返回。config_xml.Element("admin_email")null
0赞 asawyer 7/24/2020
关于您的编辑 - 正在发生其他事情。如果未找到任何元素,则不会引发对的调用。参见:learn.microsoft.com/en-us/dotnet/api/....Element(...)

答:

1赞 Abraham Murciano Benzadon 7/24/2020 #1

感谢 David、asawyer 和 Lasse V. Karlsen 帮助我意识到我的错误。我把我的代码改成了这个,现在它可以工作了。

admin_email = new Email(ConfigXml.Element("admin_email").Value;

我对 和 使用了类似的技术,因此我只会在需要时将 XML 加载到字段中,并且我忘记使用属性(执行加载)而不是字段(在我使用该属性之前为 null)访问它。config_xmlConfigXmlconfig_xmlConfigXmlconfig_xml

我不知道为什么它使用断点,也许当我查看它分配给它的属性时?我不知道。