Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基本数学程序引发系统空异常_C#_Nullreferenceexception - Fatal编程技术网

C# 基本数学程序引发系统空异常

C# 基本数学程序引发系统空异常,c#,nullreferenceexception,C#,Nullreferenceexception,这是一个基本的数学程序,我只想将这些值num1和num2保存到类中保存的列表中。当程序到达添加它的行时,它会不断抛出此错误 System.NullReferenceException:“对象引用未设置为对象的实例。” 我知道我做错了什么是显而易见的,但我现在不确定 class Program { static void Main(string[] args) { PromptAndAddUserNums(); } publ

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

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()
    {
    }
}
类程序
{
静态void Main(字符串[]参数)
{
PromptAndAddUserNums();
}
公共静态void PromptAndAddUserNums(){
bool-goToken=true;
UserInfo UserInfo=新UserInfo();
while(goToken)
{
控制台写入线(“插入第一个编号”);
int num1=int.Parse(Console.ReadLine());
控制台写入线(“插入第二个编号”);
int num2=int.Parse(Console.ReadLine());
userInfo.NumList.Add(num1);
userInfo.NumList.Add(num2);
Console.WriteLine(“您想添加另一个号码吗?(是或否)”);
字符串userChoice=Console.ReadLine().ToUpper();
如果(userChoice==“是”)
{
继续;
}
else if(userChoice==“否”)
{
goToken=false;
}
}
}
}
类UserInfo{
公共列表NumList{get;set;}
公共用户信息()
{
}
}

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

UserInfo UserInfo=newuserinfo();
您应该对
列表执行相同的操作,我认为最好的位置是在构造函数中:

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


根据Jon Skeet评论进行编辑:

您可以使用调用的C#6特性为属性提供初始值。此外,您的属性似乎不需要setter,因此您可以这样做:

public List NumList{get;}=new List();

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

  • 要保持编码风格的一致性,除了
    PromptAndAddUserNums
    UserInfo
    类之外,您在任何地方都使用allman大括号(即在换行符上放大括号)

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

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

    类程序
    {
    静态void Main(字符串[]参数)
    {
    PromptAndAddUserNums();
    }
    公共静态void PromptAndAddUserNums()
    {
    var userInfo=new userInfo();
    while(true)
    {
    控制台写入线(“插入第一个编号”);
    int num1=int.Parse(Console.ReadLine());
    控制台写入线(“插入第二个编号”);
    int num2=int.Parse(Console.ReadLine());
    userInfo.NumList.Add(num1);
    userInfo.NumList.Add(num2);
    Console.WriteLine(“您想添加另一个号码吗?(是或否)”);
    字符串userChoice=Console.ReadLine().ToUpper();
    如果(userChoice==“否”)
    {
    打破
    }
    }
    }
    }
    类用户信息
    {
    public List NumList{get;}=new List();
    }
    

公共列表NumList
从不使用
新列表进行初始化
这是否回答了您的问题?使用get set时,我将在何处初始化。我理解null reference异常,但不知道在哪里初始化它。因为这通常是在创建时完成的。但是当使用这个get set时,它在创建时并没有初始化。您可以编写
NumList{get;set;}=new List()UserInfo
时,将其放入构造函数,或在调用代码中设置它。请注意,如果您确实理解了错误所在,那么应该在问题中指定它-此时听起来您似乎不知道异常发生的原因。或者删除无参数构造函数声明,然后编写
public List NumList{get;set;}=new List()
-或将其设为只读属性:
公共列表NumList{get;}=new List()。没有迹象表明OP真的需要设置它。