基础数学程序抛出系统空异常

Basic Math program throws system null exception

这是一个基本的数学程序,其中我只想将这些值 num1num2 保存到 class 中保存的列表中。当程序到达添加它的行时,这会不断抛出此错误。

System.NullReferenceException: 'Object reference not set to an instance of an object.'

我知道我做错了什么是显而易见的,但我现在不确定。

class Program
{
    static void Main(string[] args)            
    {
        PromptAndAddUserNums();
    }

    public static void PromptAndAddUserNums() {
        bool goToken = true;
        UserInfo userInfo = new UserInfo();

        while (goToken)
        {
            Console.WriteLine("insert 1st number");
            int num1 = int.Parse(Console.ReadLine());

            Console.WriteLine("insert 2nd number");
            int num2 = int.Parse(Console.ReadLine());

            userInfo.NumList.Add(num1);
            userInfo.NumList.Add(num2);

            Console.WriteLine("do you wanna add another number?(yes or no)");
            string userChoice = Console.ReadLine().ToUpper();

            if (userChoice == "YES")
            {
                continue;
            }
            else if (userChoice == "NO")
            {
                goToken = false;
            }
        }
    }
}

class UserInfo{    
    public  List<int> NumList  { get; set; }
    public UserInfo()
    {
    }
}

当您创建一个类型为 class 的变量时,它的默认值为 null,因为它是引用类型。您应该使用 new 关键字对其进行初始化。就像你所做的那样:

UserInfo userInfo = new UserInfo();

你应该对 List<int> 做同样的事情,我认为最好的地方是在构造函数中:

public UserInfo()
{
    NumList = new List<int>();
}

这样,当您创建一个新的 UserInfo 对象时,将调用构造函数并将 NumList 初始化为一个新的 List()。因此,当您执行 userInfoObject.NumList.Add(...) 时,Add 方法将应用于已初始化的列表,而不是 null。


根据 Jon Skeet 评论编辑:

您可以使用名为 Auto-property initializer 的 C# 6 功能为您的 属性 提供初始值。此外,您的 属性 似乎不需要 setter,因此您可以这样做:

public List<int> NumList { get; } = new List<int>();

一些与您的问题无关的评论:

  • 在你的编码风格上保持一致,除了 PromptAndAddUserNumsUserInfo class.

  • 如果作业中的类型很明显,我会使用 implicitly typed local variables。 (var userInfo = new UserInfo(); 而不是 UserInfo userInfo = new UserInfo();

  • 我不认为你真的需要布尔 goToken,我会简化代码如下:

    class Program
    {
        static void Main(string[] args)            
        {
            PromptAndAddUserNums();
        }
    
        public static void PromptAndAddUserNums()
        {
            var userInfo = new UserInfo();
    
            while (true)
            {
                Console.WriteLine("insert 1st number");
                int num1 = int.Parse(Console.ReadLine());
    
                Console.WriteLine("insert 2nd number");
                int num2 = int.Parse(Console.ReadLine());
    
                userInfo.NumList.Add(num1);
                userInfo.NumList.Add(num2);
    
                Console.WriteLine("do you wanna add another number?(yes or no)");
                string userChoice = Console.ReadLine().ToUpper();
    
    
                if (userChoice == "NO")
                {
                    break;
                }
            }
        }
    }
    
    class UserInfo
    {
        public List<int> NumList { get; } = new List<int>();
    }