所以我试图将文本文件中的字段存储到数组中。但是当我到达这条线时
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
答案 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('*');