Нулевая ссылка в потоковом ридере

Привет у меня был этот код, и он работал хорошо:

    private void Textparsing()
    {               
        using (StreamReader sr = new StreamReader(Masterbuildpropertiespath))                 
        {                    
                while (sr.Peek() >= 0)
                {
                    if (sr.ReadLine().StartsWith("Exec_mail"))
                    {
                        ExecmailCheckBox.IsChecked = true;
                    }
                    if (sr.ReadLine().StartsWith("Exec_text"))
                    {
                        ExectextCheckBox.IsChecked = true;
                    }
                    if (sr.ReadLine().StartsWith("Exec_3"))
                    {
                        Exec3CheckBox.IsChecked = true;
                    }
                    if (sr.ReadLine().StartsWith("Exec_4"))
                    {
                        Exec4CheckBox.IsChecked = true;
                    }
                }              
        }               
    }

Это было прекрасно, и я получил все 4 флажка, когда я получил правильный текст в файле.

Тем не менее, я получаю сообщение об ошибке Nullreference в этой строке:

if (sr.ReadLine().StartsWith("Exec_text"))
{
      ExectextCheckBox.IsChecked = true;
}

Когда мы проверили его на 1 цель (значит, я сделал 3 другие цели в качестве комментариев), все работало нормально. Пожалуйста посоветуй

3 ответа

Решение

С оценкой КАЖДОГО оператора if читается строка. Лучше прочитать строку и затем иметь несколько if:

var line = reader.ReadLine();
if(!String.IsNullOrEmpty(line)
{
    if(line.StartsWith(...))
    { ... }
    if(line.StartsWith(...))
    { ... }
}

Geremychan, в коде, который вы разместили, для каждой итерации вы проверяете Peek()>=0 один раз и читая четыре строки после него!

проверка Peek()>=0 только один раз гарантирует, что после него стоит одна строка.

Измените ваш код, как показано ниже:

        using (StreamReader sr = new StreamReader(Masterbuildpropertiespath)) 
        {
            while (sr.Peek() >= 0) 
            {
                String line=sr.ReadLine();
                if (line.StartsWith("Exec_mail")) 
                { 
                    ExecmailCheckBox.IsChecked = true; 
                }
                else if (line.StartsWith("Exec_text"))
                {
                    ExectextCheckBox.IsChecked = true; 
                } 
             .......
          }

Readline() возвращает null, если в вашем потоке больше не осталось ни одной строки для чтения. так что вы должны проверить на ноль или подумать об использовании

while(sr.ReadLine())
{
}

вместо while(sr.Peek()>=0)

Другие вопросы по тегам