C#中的空引用exception

当我试图从结构中返回一个值时,我遇到了“空引用exception”。

这是代码:

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的子来初始化item。 在检查文件是否存在之后,我使用流读取器逐个读取文件的行,直到找到特定的行并停止。 问题是它检查文件是否存在但未找到特定行。 它返回null甚至很难我将item初始化为false,并在找不到该行时将其设置为false。 注意:当我访问其他要读取的文件时,这种情况很少发生并且工作正常,甚至在返回null的同一文件中也是如此。

注意:我遇到的另一个问题是它跳过它读取的一行。

可能是什么原因造成的?

并且文件的末尾, 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; ... } } 

我可以在您的代码中找到的一个问题是您不需要以下行:

 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; } } } 

在旁注中,为什么要创建一个新实例然后重新分配给它而不用于任何目的..

 AssetItem item = new AssetItem(); item = initModified(); 

可能成为

 AssetItem item = initModified();