Исключение нулевой ссылки в C # - PullRequest
1 голос
/ 08 ноября 2010

Я испытываю «исключение нулевой ссылки», когда пытаюсь вернуть значение из структуры.

вот код:

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, когда он не находит строку.Примечание: это происходит редко и работает нормально, когда я получаю доступ к другим файлам для чтения, и даже в том же файле, который возвращает ноль.

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

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

Ответы [ 3 ]

7 голосов
/ 08 ноября 2010

И конец файла, ReadLine() возвращает ноль - и вы затем вызываете .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 голос
/ 08 ноября 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;
        }
    }
}
0 голосов
/ 08 ноября 2010

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

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

Может стать

AssetItem item =  initModified();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...