流读取器中的空引用

发布于 2024-10-22 19:55:21 字数 1242 浏览 3 评论 0原文

你好,我有这段代码,它运行良好:

    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 个目标作为注释),一切正常。请指教

hello i had this code and it worked well:

    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;
                    }
                }              
        }               
    }

It was perfect and i got all the 4 checkbox checked when i got the correct text in the file.

However, I am receiving Nullreference error over at this line:

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

When test it out for 1 target(means i make the other 3 targets as comments), it all worked fine. Please advice

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

愁杀 2024-10-29 19:55:21

通过评估每个 if 语句,正在读取一行。更好的方法是阅读该行,然后使用多个 if:

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

With the evaluation of EACH if statement a line is being read. Better is to read the line and then have the multiple ifs:

var line = reader.ReadLine();
if(!String.IsNullOrEmpty(line)
{
    if(line.StartsWith(...))
    { ... }
    if(line.StartsWith(...))
    { ... }
}
在风中等你 2024-10-29 19:55:21

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; 
                } 
             .......
          }

Geremychan, in the code you have posted, for each iteration you are checking the Peek()>=0 once and reading four lines after it !

Checking Peek()>=0 once only gurantees that there is one line after it.

Modify your code as below:

        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; 
                } 
             .......
          }
何以心动 2024-10-29 19:55:21

如果您的流不再有任何行可读取,Readline() 返回 null。所以你应该检查 null 或考虑使用

while(sr.ReadLine())
{
}

而不是 while(sr.Peek()>=0)

Readline() return null if your stream did not have any line to read anymore. so you should check for null or think about using

while(sr.ReadLine())
{
}

instead of while(sr.Peek()>=0)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文