0

对于这样一个简单的问题,我深表歉意,但我已经努力修复此代码几个小时了,但我无法取得任何进展。

我有一个项目需要使用三个类:客户、员工和客户组。这些类从文件 (.csv) 中填充,然后转储回显示其内容的控制台。客户组类,它包含员工类的单个实例和客户列表以及处理几个类唯一变量的其他几个列表。转储我的代码时,我得到一些未处理的异常错误,调试表明客户组类中的客户类为空。据我所知,可能存在一系列其他问题,但获取这个类的列表是问题所在。

代码本身很长,因此为了简洁起见,我将尝试对其进行精简。

有问题的程序位:

while (dataArray[i] == "End")
        {
            int.TryParse(dataArray[i], out temp);
            i++;
            testGrp.Customers.Add(new Customer(temp, dataArray[i++], dataArray[i++], dataArray[i++], dataArray[i++]));
            double.TryParse(dataArray[i], out doubleTemp);
            testGrp.AmountSpent.Add(doubleTemp);
            i++;
            testGrp.SpendingLevel.Add(dataArray[i]);
            i++;
        }

客户群类:

public CustomerGrp(int groupId, Employee executive, List<Customer> customers,   List<double> amountSpent, List<string> spendingLevel)
    {
        this.groupId = groupId;
        this.executive = executive;
        this.customers = customers;
        this.amountSpent = amountSpent;
        this.spendingLevel = spendingLevel;
    }

和客户类:

public Customer(int newId, string newName, string newPhoneNumber, string newAddress, string newMarried)
    {
        this.Id = newId;
        this.Name = newName;
        this.PhoneNumber = newPhoneNumber;
        this.Address = newAddress;
        this.Married = newMarried;
    }

dataArray 是通过将 csv 文件中的初始字符串分解为更小的位而生成的数组。它并不漂亮,但它现在已经达到了它的目的。在此之前,已经处理了 groupID 和执行位,以 i++ 结尾以准备显示的部分。

我可以在没有错误的情况下填充 Employee 执行部分,但是在一个类中填充一个类列表是我无法完全理解的事情。我认为我做得对,但我能找到的大多数例子并不完全适合这种情况。我知道我的代码一点也不漂亮,但我只是在开始清理之前尝试建立基本功能。任何帮助或建议将不胜感激。

编辑

如所问,控制台中给出的消息如下:

System.NullReferenceException 对象引用未设置为对象的实例。在“线”和“线”。

这些行是:

DumpContents(testGrp);

static void DumpContents(CustomerGrp customerGrp)
    {
        Console.WriteLine("------- Customer Content -------");
        Console.WriteLine("         Id: {0}", customerGrp.GroupId);
        DumpContents(customerGrp.Executive);
        foreach (Customer cust in customerGrp.Customers)
        {
            DumpContents(cust); // <- Exception Error line here
        }
        Console.WriteLine("--------------------------------");
    }

编辑

包含重载的 DumpContents 函数:

static void DumpContents(Employee employee)
     {
        Console.WriteLine("------- Employee Content -------");
        Console.WriteLine("         Id: {0}", employee.Id);
        Console.WriteLine("       Name: {0}", employee.Name);
        Console.WriteLine(" Start Date: {0}", employee.StartDate);
        Console.WriteLine("       Rate: {0}", employee.GetRate());
        Console.WriteLine("      Hours: {0}", employee.GetHours());
        Console.WriteLine("        Pay: {0}", employee.CalcPay());
        Console.WriteLine("     Tenure: {0} Years", employee.GetTenure());
        Console.WriteLine("--------------------------------");
    }

    static void DumpContents(Customer customer)
    {
        Console.WriteLine("------- Customer Content -------");
        Console.WriteLine("            Id: {0}", customer.Id);
        Console.WriteLine("          Name: {0}", customer.Name);
        Console.WriteLine("  Phone Number: {0}", customer.PhoneNumber);
        Console.WriteLine("       Address: {0}", customer.Address);
        Console.WriteLine("Marital Status: {0}", customer.Married);
        Console.WriteLine("--------------------------------");
    }
4

2 回答 2

0

确保在程序循环之前初始化一个新的瞬间 testGrp.Customers = new list ();

好像你跳过了一个 i in loop

编辑:哇,你很好,你知道我在用我的手机来回答这个问题。

我相信他得到了错误,因为他的客户对象从未被实例化。通常,您不会在 DumpContents 行上收到错误,因为它是一个 foreach 循环,除非该对象在线程之间共享。您可能会在此行的上一行中得到错误:foreach (Customer cust in customerGrp.Customers)

这就是为什么我要求他确保客户对象被实例化

但这只是我的猜测......

于 2013-02-20T00:31:33.123 回答
0

行 DumpContents(customerGrp.Executive) 递归调用 DumpContents 方法 - 但使用 Employee 类型,然后再次使用 Customer 类型循环。DumpContents 必须传递一个 CustomerGrp。

简单的解决方法是重载 DumpContents 方法以转储不同类型的信息,例如:

static void DumpContents(CustomerGrp customerGrp)
{
    Console.WriteLine("------- Customer Content -------");
    Console.WriteLine("         Id: {0}", customerGrp.GroupId);
    DumpContents(customerGrp.Executive);
    foreach (Customer cust in customerGrp.Customers)
    {
        DumpContents(cust); // <- Exception Error line here
    }
    Console.WriteLine("--------------------------------");
}


static void DumpContents(Employee employee)
{
    Console.WriteLine("------- Employee Content -------");
    Console.WriteLine("         Id: {0}", employee.Id);
    ...
}


static void DumpContents(Customer customer)
{
    Console.WriteLine("------- CustomerContent -------");
    Console.WriteLine("         Id: {0}", customer.Id);
    ...
}
于 2013-02-20T00:07:04.250 回答