Исключение Null Reference в 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. Убедившись, что файл существует, я использовал потоковую программу для чтения строк файла одну за другой, пока не найдет определенную строку и не остановится. Проблема в том, что он проверяет, существует ли файл, и не находит конкретной строки. Он возвращает ноль, даже если я инициализирую элемент значением false и устанавливаю его на значение false, когда он не находит строку. Примечание. Это происходит редко и отлично работает, когда я обращаюсь к другим файлам для чтения и даже в том же файле, который возвращает значение null.

Примечание. Еще одна проблема, с которой я столкнулся, заключается в том, что он пропускает строку, которую читает.

Что может быть причиной этого?


person gibz357    schedule 08.11.2010    source источник
comment
Это всего лишь совет, и он не имеет отношения к вашей проблеме: вы можете удалить некоторые строки в конце, выполнив следующие действия item.modified = found;   -  person Dinah    schedule 09.11.2010


Ответы (3)


И в конце файла ReadLine() возвращает null - и вы затем вызываете .Trim() без проверки (в сценарии, когда элемента нет, и вы читаете файл полностью) - поэтому вам нужно добавить null- проверьте (обратите внимание, что я переместил 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;
        ...
    }
}
person Marc Gravell    schedule 08.11.2010
comment
@Mark Gravell - Спасибо, теперь все работает нормально после проверки файлов, к которым я обращался. - person gibz357; 08.11.2010

Одна проблема, которую я могу найти в вашем коде, заключается в том, что вам не нужна следующая строка:

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;
        }
    }
}
person Aamir    schedule 08.11.2010

Кстати, зачем создавать новый экземпляр, а затем переназначать его, не используя его ни для каких целей.

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

Мог стать

AssetItem item =  initModified();
person Richard Friend    schedule 08.11.2010