1

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

这是代码:

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 的同一文件中时,这种情况很少发生并且工作正常。

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

这可能是什么原因?

4

3 回答 3

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;
        ...
    }
}
于 2010-11-08T09:25:31.173 回答
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;
        }
    }
}
于 2010-11-08T09:28:35.847 回答
0

附带说明一下,为什么要创建一个新实例然后重新分配给它而不将其用于任何目的..

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

可能成为

AssetItem item =  initModified();
于 2010-11-08T11:08:45.720 回答