测试下述C#代码时为何出现“Value cannot be null”错误?
问题分析与修复方案
错误原因
- 固定长度数组产生空元素:代码用了长度为10的数组,若用户提前输入"x"中断输入,数组未被赋值的位置会保留默认
null值,第二个循环遍历到这些null时,调用Int32.Parse(null)就会触发ArgumentNullException - 大小写匹配限制:代码只判断小写"x",用户输入大写"X"不会触发中断,会继续填充数组
- 未处理无效输入:若用户输入非整数、非"X"的内容,
Int32.Parse也会抛出异常
修复后的代码
List<string> inputNumbers = new List<string>(); bool foundEven = false; while (true) { string input = Console.ReadLine(); // 忽略大小写判断退出指令 if (input.Equals("x", StringComparison.OrdinalIgnoreCase)) { break; } inputNumbers.Add(input); } foreach (string numStr in inputNumbers) { // 安全解析整数,避免无效输入异常 if (int.TryParse(numStr, out int number)) { if (number % 2 == 0) { foundEven = true; Console.WriteLine(numStr); } } } if (!foundEven) { Console.WriteLine("N/A"); } Console.ReadLine();
修复要点
- 用
List<string>替代固定数组,仅存储用户实际输入内容,彻底避免空元素问题 - 用
StringComparison.OrdinalIgnoreCase实现大小写无关判断,支持输入"X"或"x"退出 - 用
int.TryParse替代Int32.Parse,既避免解析失败的异常,又能安全获取整数值 - 遍历实际输入的集合,无需处理数组中未赋值的无效位置
内容的提问来源于stack exchange,提问作者Dragos Bogdan
相关产品推荐
相关产品推荐

