首页 > 解决方案 > 基础数学程序抛出系统空异常

问题描述

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

System.NullReferenceException:“对象引用未设置为对象的实例。”

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

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()
    {
    }
}

标签: c#nullreferenceexception

解决方案


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

UserInfo userInfo = new UserInfo();

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

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

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


根据 Jon Skeet 评论编辑:

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

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

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

  • PromptAndAddUserNums在您的编码风格中保持一致,除了和UserInfoclass之外,您在所有地方都使用 allman 大括号(即,将大括号放在换行符上) 。

  • 如果类型从赋值中显而易见,我会使用隐式类型的局部变量。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>();
    }
    

推荐阅读