C# 列表未初始化 [已关闭]

C# List not initializing [closed]

提问人:Nicola K 提问时间:7/18/2018 最后编辑:Nicola K 更新时间:7/18/2018 访问量:512

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

5年前关闭。

所以我现在有两个列表的这个类。一个正在初始化,一个没有,我不明白为什么。 就在那里,因为我认为我太愚蠢了,无法初始化列表,但工作得很好。someListsomeList

这是我的班级:

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

class Calendar
{
    static List<CalendarNode> _calendar = new List<CalendarNode>();
    static List<int> someList = new List<int>();

    public static int addNode(CalendarNode node)
    {
        if (_calendar != null)
        {
            foreach (CalendarNode item in _calendar)
            {
                if (item.Username == node.Username)
                {
                    return 1;
                }

            }

        }
        someList.Add(1);        // works like a charm
        _calendar.Add(node);    // throws Error Object reference not set to an instance of an object
    }
}

我做错了什么?

感谢您的帮助

编辑1:

Regex pattern = new Regex(@"\.0000");
        DateTime date;
        IUserMessage message;
        CalendarNode node = new CalendarNode();

        try
        {
            if (pattern.Match(birthday).Success)
            {
                Regex replace = new Regex(@"\d{4}");
                birthday = replace.Replace(birthday, "1900");
                date = DateTime.ParseExact(birthday, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture);
            }
            else
            {
                date = DateTime.ParseExact(birthday, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture);
            }

            node = new CalendarNode(Context.User.Mention, date);
        }
        catch (Exception)
        {
            message = await Context.Channel.SendMessageAsync($"Probably invalid date! Use format: \"dd.mm.yyyy\"\nIf the error persists, contact Nigolasy");
        }
        int status = 2;
        if (node != null)
        {
            status = Calendar.addNode(node); 
        }

这是我调用 addNode 的代码。

还有我的 CalendarNode 类,以防万一它很重要

class CalendarNode
{
    string username;
    DateTime birthdate;

    public CalendarNode(string username, DateTime birthdate)
    {
        this.username = username;
        this.birthdate = birthdate;
    }
    public CalendarNode(){ }

    public string Username { get { return username; } }
    public DateTime Birthdate { get { return birthdate; } }
}
C# 列表 NullReferenceException

评论

4赞 Yeldar Kurmangaliyev 7/18/2018
至于我,这段代码看起来不错。还有其他相关代码吗?P.S. 当然,假设它在指定行抛出异常。
1赞 Manpreet Singh Dhillon 7/18/2018
参数节点可能为 null。
5赞 DavidG 7/18/2018
除了方法不返回任何内容(这意味着代码不会编译)之外,我在这里没有看到任何问题。这真的是你的代码吗?addNode
1赞 Matthew Watson 7/18/2018
确定是那条线抛出了异常吗?因为 if 是 null 并且不是 null(它不会是),如果它也不为空,那么当您访问node_calendarif (item.Username == node.Username)node.Username
1赞 Corak 7/18/2018
为什么删除节点不需要?无论如何,如果您确定异常发生在该行,则该异常只能由 null 引起(您可以使用断点看到它以确保为 null)。现在这就提出了一个问题:什么时候将其设置为 null?您发布的代码没有显示这一点。对于您发布的代码,不能为空。所以你对我们隐瞒了一些事情。_calendarreadonly_calendar_calendar_calendar

答:

0赞 Chad 7/18/2018 #1

你的应用正在将节点添加到 null 列表中,因为它超出了 null 检查范围。

public static int addNode(CalendarNode node)
{
    if (_calendar != null)
    {
        foreach (CalendarNode item in _calendar)
        {
            if (item.Username == node.Username)
            {
                return 1;
            }

        }
             _calendar.Add(node);
    }

}

评论

0赞 Nicola K 7/18/2018
这不是应该做的。如果在日历中找到用户,则不应添加该用户。这就是为什么我返回 1 而不是 0 的原因。
0赞 PaulF 7/18/2018
我认为代码的想法是它不会向列表中添加重复的条目 - 因此它会循环当前列表并在找到匹配项时退出。使用此代码,永远无法添加节点。
0赞 Chad 7/18/2018
@NicolaK - 更新了答案,为你想做什么提供了更好的逻辑
0赞 PaulF 7/18/2018
好吧,这将避免异常 - 但它并没有回答为什么“_calendar”首先是空的。它被初始化为正确类型列表的新实例,并且OP已经检查了代码似乎没有将其设置为null。“somelist”以相同的方式初始化,并且不为空。
1赞 Nicola K 7/18/2018 #2

所以,我感到很惭愧。

在从代码的字面开始调试所有内容后,我发现了一个加载函数,它不应该存在,它将我的空 JSON 字符串 ofc 设置为空列表。我写的时候一定是半睡半醒,我没有把它放在我的课堂上......_calendar

我不知道为什么Visual Studio没有向我显示这部分,当我之前搜索时。也许是因为我没有打开启动文件?_calendar

无论如何,感谢您的帮助和时间。

(我仍然会研究这个部分,看起来非常重要!lock

评论

1赞 PaulF 7/19/2018
将字段隐藏在属性后面也会有所帮助 - 它们允许在要更改的属性上设置断点,因为托管代码不允许数据断点。
0赞 Corak 7/19/2018
另请参阅:线程同步