C#中的空引用异常

时间:2010-11-08 09:18:44

标签: c# streaming nullreferenceexception notepad

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

这是代码:

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的同一文件中也是如此。

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

这可能是什么原因?

3 个答案:

答案 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();