Нулевая ссылка в потоковом ридере
Привет у меня был этот код, и он работал хорошо:
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)