нулевая ссылка в потоковом ридере - PullRequest
1 голос
/ 16 марта 2011

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

    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 ]

3 голосов
/ 16 марта 2011

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

var line = reader.ReadLine();
if(!String.IsNullOrEmpty(line)
{
    if(line.StartsWith(...))
    { ... }
    if(line.StartsWith(...))
    { ... }
}
1 голос
/ 16 марта 2011

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; 
                } 
             .......
          }
0 голосов
/ 16 марта 2011

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

while(sr.ReadLine())
{
}

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

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