当我尝试从结构中返回值时,我遇到“空引用异常”。
这是代码:
AssetItem item = new AssetItem();
item = initModified();
bool found = false;
int index = getIndex(barcode);
string modifiedFile = filepath + "Modified\\" + dir + "\\" + index + ".asdt";
if(File.Exists(modifiedFile))
{
using(StreamReader reader = new StreamReader(modifiedFile))
{
string line = reader.ReadLine();
while(line.Trim()!="")
{
string[] split = line.Split(',');
if(split[1]==barcode)
{
found = true;
break;
}
line = reader.ReadLine();
}
reader.Close();
}
}
if(found)
{
item.modified = true;
}
else
{
item.modified = false;
}
return item;
我通过调用包含该item.modified = false的子来初始化项目。在检查文件是否存在之后,我使用流读取器逐个读取文件的行,直到找到特定的行并停止。问题是它检查文件是否存在但未找到特定行。它返回null即使很难我将item初始化为false,并在找不到该行时将其设置为false。注意:当我访问其他要读取的文件时,这种情况很少发生并且工作正常,甚至在返回null的同一文件中也是如此。
注意:我遇到的另一个问题是它会跳过它读取的一行。
这可能是什么原因?
答案 0 :(得分:7)
文件末尾ReadLine()
返回null - 然后你不用检查就调用.Trim()
(在项目不存在的情况下你一直读到文件)通过) - 因此你需要添加一个空检查(注意我也移动了ReadLine
所以它一直发生):
using(StreamReader reader = new StreamReader(modifiedFile))
{
string line;
while((line = reader.ReadLine()) != null && line.Trim() != "") {
...
}
}
请注意,上面的代码(基于你的代码)将在第一个空行结束;我个人可能跳过空行:
using(StreamReader reader = new StreamReader(modifiedFile))
{
string line;
while((line = reader.ReadLine()) != null) {
if(line.Trim() == "") continue;
...
}
}
答案 1 :(得分:1)
我可以在您的代码中找到的一个问题是您不需要以下行:
reader.Close();
using
会自动为您执行此操作。
此外,您的循环条件应检查EndOfStream
而不是修剪线。
即,将代码修改为以下内容:
using(StreamReader reader = new StreamReader(modifiedFile))
{
while(!reader.EndOfStream)
{
string line = reader.ReadLine();
string[] split = line.Split(',');
if(split[1]==barcode)
{
found = true;
break;
}
}
}
答案 2 :(得分:0)
在旁注中,为什么要创建一个新实例然后重新分配给它而不将其用于任何目的..
AssetItem item = new AssetItem();
item = initModified();
可以成为
AssetItem item = initModified();