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真的需要设置它。