StreamReader在while循环中读取null

时间:2019-12-01 05:05:56

标签: c# while-loop streamreader argumentnullexception

使用这种方法,我正在遍历一个文件,以删除其中带有'T'的行并将它们存储到列表中。在循环结束时,它应该退出,但是它会读取null值并继续传递它,并抛出异常并显示消息...

  

System.ArgumentNullException:'值不能为null。参数名称:来源'

...试图查找字符的地方。

public static List<string> GetToolsFromFile()
{
    FileStream FS = new FileStream(OpenFile(), FileMode.Open);
    List<string> list = new List<string>();

    using (StreamReader Sr = new StreamReader(FS))
    {
        char c = 'T';

        while (Sr.ReadLine() != null)
        {
            string line = Sr.ReadLine();
            //MessageBox.Show(line.ToString());
            if (line.Contains(c))
            {
                list.Add(line);
                // MessageBox.Show(line.ToString());
            }
        }

        FS.Close();
    }

    return list;
}

OpenFile()是使用OpenFileDialog的方法。此文件经过测试并可以正常工作,它可以检索并显示所选文件的内容。

2 个答案:

答案 0 :(得分:1)

您两次调用ReadLine方法。第一次是在while循环条件下,第二次是在while体内。假设您的文件只有3行,下面是对ReadLine方法的调用:

  1. 在循环条件下,它读取第一行。
  2. 在循环体内,它读取第二行并将其分配给line变量。
  3. 在循环条件下,它读取第三行(这是最后一行)。
  4. 在循环体中,它返回null,因此将line变量分配为null,然后在空字符串上调用Contains方法。这就是异常的意思。

答案 1 :(得分:0)

请参阅更正的代码

FileStream FS = File.Open(@"c:\path_to_The_File", FileMode.Open);
        List<string> list = new List<string>();

        using (StreamReader Sr = new StreamReader(FS))
        {
            char c = 'T';

            string line = Sr.ReadLine();
            while (line != null)
            {

                //MessageBox.Show(line.ToString());
                if (line.Contains(c))
                {
                    list.Add(line);
                    // MessageBox.Show(line.ToString());
                }

                line = Sr.ReadLine();
            }


            FS.Close();
        }