尝试存储数组时出现Null Reference Exception

时间:2016-03-06 04:16:49

标签: c# visual-studio-2012

所以我试图将文本文件中的字段存储到数组中。但是当我到达这条线时

data = record.Trim().Split('*');

我收到错误消息“对象引用未设置为对象的实例。”

public bool matchCustomer(string accountID, string record)
    {
        String[] data = new String[5];
        data = null;
        data = record.Trim().Split('*');
        this.accountNumber = data[0];
        if (accountID == this.accountNumber)
            {
                return true;
            }
        else
        {
           return false;
          }
       }

这是调用方法的地方:

public bool findCustomer(string accountNumber)
    {
        string record = Global.currentFile.getNextRecord(ref endOfFile);
        bool okay = Global.customer.matchCustomer(accountNumber, record);
        return okay;
    }

以下是getNextRecord

   public string getNextRecord(ref Boolean endOfFileFlag)
    {
        string nextRecord;

        endOfFileFlag = false;
        nextRecord = reader.ReadLine();

        if (nextRecord == null)
        {
            endOfFileFlag = true;
        }
        else
        {
            recordReadCount += 1;
        } // end if

        return (nextRecord);
    } // end getNextRecord

2 个答案:

答案 0 :(得分:2)

首先,您可以通过替换以下内容来简化代码:

String[] data = new String[5];
data = null;
data = record.Trim().Split('*');

只有一行:

string[] data = record.Trim().Split('*');

这是一个正确的陈述,因为您不知道string[]函数返回的Split()数组的最大索引(元素)。

其次,确保record!=null,并且它还有一个包含" *"的字符串。在Split()函数中用作分隔符的字符。

答案 1 :(得分:2)

让我们看一下这行代码

data = record.Trim().Split('*');

如果此处发生NullReferenceException,则表示您必须在空对象上调用方法。在这种情况下,唯一可能的对象是record

现在我们知道什么是null,但为什么它为null?让我们来看看这个方法:

public bool findCustomer(string accountNumber)
{
    string record = Global.currentFile.getNextRecord(ref endOfFile);
    bool okay = Global.customer.matchCustomer(accountNumber, record);
    return okay;
}

显然,您使用getNextRecord的返回值来调用matchCustomer。这意味着getNextRecord必须返回null返回!因此,让我们找出getNextRecord返回null的原因:

public string getNextRecord(ref Boolean endOfFileFlag)
{
    string nextRecord;

    endOfFileFlag = false;
    nextRecord = reader.ReadLine();

    if (nextRecord == null)
    {
        endOfFileFlag = true;
    }
    else
    {
        recordReadCount += 1;
    } // end if

    return (nextRecord);
} // end getNextRecord

如果方法return nextRecord,则表示nextRecord为空。你是怎么得到nextRecord的? reader.ReadLine

因此record为空的最终原因是reader.ReadLine为空。

要避免此异常,您需要先检查record是否为空,然后调用该方法:

if (record != null) {
    data = record.Trim().Split('*');
} else {
    // do other stuff
}

在C#6中,这可以简化为

data = record?.Trim().Split('*');

如果record为空,data也将为空!

另请注意,此代码是多余的:

String[] data = new String[5];
data = null;

您正在创建一堆字符串,然后将数组设置为null。重点是什么?所以您可以删除它,并将下一行更改为:

string[] data = record?.Trim().Split('*');