C#控制台程序按销售等级打印销售员信息时遇空引用异常求助
问题原因分析
你的代码触发NullReferenceException的核心原因有三个:
- 等级数组存在大量空引用:你创建的
level1/level2等数组和原数组长度一致,但只有当原数组第i位销售员对应等级时,才会给等级数组的第i位赋值,其余位置都是null。打印时遍历整个等级数组,访问null对象的name属性必然报错。 - 循环遗漏最后一个元素:遍历原数组时用了
i < salesmenArray.Length - 1,这会跳过最后一位销售员(索引为salesmenArray.Length -1的元素)。 - 等级人数统计错误:你用
level1.Length -1统计等级人数,实际上等级数组长度和原数组一致,这个值根本不是该等级的实际销售员数量。
修复方案(推荐用List实现)
用List<Salesman>替代数组,它可以动态添加元素,不会有空引用问题,代码更简洁:
public static void sortering(Salesman[] salesmenArray) { List<Salesman> level1 = new List<Salesman>(); List<Salesman> level2 = new List<Salesman>(); List<Salesman> level3 = new List<Salesman>(); List<Salesman> level4 = new List<Salesman>(); // 遍历所有销售员,按等级分类 foreach (var salesman in salesmenArray) { switch (salesman.level) { case 1: level1.Add(salesman); break; case 2: level2.Add(salesman); break; case 3: level3.Add(salesman); break; case 4: level4.Add(salesman); break; // 可添加default分支处理异常等级情况 } } // 打印各等级销售员信息 PrintSalesmen(level1, 1); PrintSalesmen(level2, 2); PrintSalesmen(level3, 3); PrintSalesmen(level4, 4); } // 提取打印逻辑,避免重复代码 private static void PrintSalesmen(List<Salesman> salesmen, int level) { if (salesmen.Count == 0) return; foreach (var salesman in salesmen) { Console.WriteLine("Name: " + salesman.name); Console.WriteLine("District: " + salesman.district); Console.WriteLine("Items sold: " + salesman.itemsSold); Console.WriteLine("---"); // 分隔每个销售员信息 } Console.WriteLine($"{salesmen.Count} sellers have reached level {level}"); Console.WriteLine(); // 分隔不同等级 }
如果坚持用数组实现
如果必须用数组,需要先统计每个等级的人数,再创建对应长度的数组,然后填充:
public static void sortering(Salesman[] salesmenArray) { // 统计各等级人数 int count1 = 0, count2 = 0, count3 = 0, count4 = 0; foreach (var salesman in salesmenArray) { switch (salesman.level) { case 1: count1++; break; case 2: count2++; break; case 3: count3++; break; case 4: count4++; break; } } // 创建对应长度的数组 Salesman[] level1 = new Salesman[count1]; Salesman[] level2 = new Salesman[count2]; Salesman[] level3 = new Salesman[count3]; Salesman[] level4 = new Salesman[count4]; // 填充数组 int idx1 = 0, idx2 = 0, idx3 = 0, idx4 = 0; foreach (var salesman in salesmenArray) { switch (salesman.level) { case 1: level1[idx1++] = salesman; break; case 2: level2[idx2++] = salesman; break; case 3: level3[idx3++] = salesman; break; case 4: level4[idx4++] = salesman; break; } } // 打印Level1信息 if (level1.Length > 0) { foreach (var salesman in level1) { Console.WriteLine("Name: " + salesman.name); Console.WriteLine("District: " + salesman.district); Console.WriteLine("Items sold: " + salesman.itemsSold); } Console.WriteLine($"{level1.Length} sellers have reached level 1"); } // 同理复制代码打印Level2、3、4信息 }
内容的提问来源于stack exchange,提问作者pinkRobot435
相关产品推荐
相关产品推荐

