2010-11-08 66 views
1

当我试图从结构中返回值时,遇到“空引用异常”。C中的空引用异常#

这里是代码:

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我将项初始化为false,并在找不到该行时将其设置为false。注意:这种情况很少发生,在我读取其他文件时甚至在它返回null的同一文件中工作正常。

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

这可能是什么原因造成的?

+0

这只是一个提示,是不相关的问题的方法:你可以通过做牛逼消除在最后几行他的'item.modified =找到;' – Dinah 2010-11-09 03:26:59

回答

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; 
     ... 
    } 
} 
+0

@Mark Gravell - 谢谢,现在检查我访问的文件后,它工作正常。 – gibz357 2010-11-08 09:42:18

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

在一个侧面说明,为什么创建一个新的实例,然后重新分配给它不使用它为任何目的..

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

可能成为

AssetItem item = initModified();