基础数学程序抛出系统空异常
Basic Math program throws system null exception
这是一个基本的数学程序,其中我只想将这些值 num1
和 num2
保存到 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>();
一些与您的问题无关的评论:
在你的编码风格上保持一致,除了 PromptAndAddUserNums
和 UserInfo
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>();
}
这是一个基本的数学程序,其中我只想将这些值 num1
和 num2
保存到 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>();
一些与您的问题无关的评论:
在你的编码风格上保持一致,除了
PromptAndAddUserNums
和UserInfo
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>(); }