Basic Math程序抛出系统空异常

问题描述 投票:0回答:1

[这是一个基本的数学程序,我只想将这些值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
1个回答
1
投票

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

UserInfo userInfo = new UserInfo();

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

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

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


根据乔恩·斯凯特(Jon Skeet)评论编辑:

您可以使用称为Auto-property initializer的C#6功能为您的属性提供初始值。同样,您似乎不需要财产的二传手,所以您可以像这样:

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

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

  • 为保持编码风格的一致性,除PromptAndAddUserNumsUserInfo类外,您都在所有地方都使用allman大括号(即,将大括号放在换行符上。)>

  • 如果类型在赋值中很明显,我将使用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>();
}
© www.soinside.com 2019 - 2024. All rights reserved.