c# - 基础数学程序抛出系统空异常
问题描述
这是一个基本的数学程序,我只想将这些值保存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()
{
}
}
解决方案
当您创建具有某个类的类型的变量时,它具有默认值,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
在您的编码风格中保持一致,除了和UserInfo
class之外,您在所有地方都使用 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>(); }
推荐阅读
- android - Android Studio Profiler 的能耗
- nginx - 未指定输入文件:无法配置 NGINX 别名
- javascript - RegEx-用打开和关闭标签替换备用特殊字符
- android - 我的应用程序因不同的屏幕尺寸而崩溃
- godaddy-api - 如何找到godaddy子账户ID
- javascript - 反应虚拟化的箭头键步进表
- kubernetes - 我的 kubernetes 集群 IP 地址已更改,现在 kubectl 将不再连接
- scala - spark - select 中的条件语句
- angular - Angular 6 使用外部库,angular json 中的脚本数组
- css - CSS GRID 在网格中避免 ::before 和 ::after