0

このような単純な質問で申し訳ありませんが、このコードの修正に数時間取り組んでおり、先に進むことができません.

顧客、従業員、顧客グループの 3 つのクラスを使用する必要があるプロジェクトがあります。クラスはファイル (.csv) から読み込まれ、内容を表示するコンソールにダンプされます。従業員クラスの単一のインスタンスと顧客のリストの両方を含む顧客グループ クラス、およびいくつかのクラス固有の変数を処理する他のいくつかのリスト。コードをダンプすると、未処理の例外エラーが発生し、デバッグにより、顧客グループ クラス内の顧客クラスが null であることが示されました。私が知っている限りでは、他にもさまざまな問題がある可能性がありますが、このクラスのリストを作成することが問題です。

コード自体はかなり長いので、簡潔にするために短くしてみます。

問題のプログラム ビット:

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 をスキップするようです

編集: うわー、あなたは良いです、あなたは私が私の電話を使って質問に答えていることを知っていました.

彼の顧客オブジェクトがインスタンス化されていないため、エラーが発生していると思います。オブジェクトがスレッド間で共有されていない限り、これは foreach ループであるため、通常、DumpContents 行でエラーが発生することはありません。代わりに、次の行の前の行でエラーが発生する可能性があります: foreach (customer cust in customerGrp.Customers)

そのため、顧客オブジェクトがインスタンス化されていることを確認するように彼に依頼しました

しかし、これは私の推測にすぎません...

于 2013-02-20T00:31:33.123 に答える
0

行 DumpContents(customerGrp.Executive) は DumpContents メソッドを再帰的に呼び出しますが、従業員型を使用し、再び顧客型を使用してループします。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 に答える