You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#控制台程序按销售等级打印销售员信息时遇空引用异常求助

问题原因分析

你的代码触发NullReferenceException的核心原因有三个:

  1. 等级数组存在大量空引用:你创建的level1/level2等数组和原数组长度一致,但只有当原数组第i位销售员对应等级时,才会给等级数组的第i位赋值,其余位置都是null。打印时遍历整个等级数组,访问null对象的name属性必然报错。
  2. 循环遗漏最后一个元素:遍历原数组时用了i < salesmenArray.Length - 1,这会跳过最后一位销售员(索引为salesmenArray.Length -1的元素)。
  3. 等级人数统计错误:你用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:57