StreamReader在while循环中读取null

问题描述 投票:-1回答:2

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

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

...在它试图查找字符的位置。

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的方法。经过测试,可以正常工作,它可以检索并显示所选文件的内容。

c# while-loop streamreader argumentnullexception
2个回答
1
投票

您正在调用ReadLine方法two次。第一次是在while循环条件下,第二次是在while体内。假设您的文件为3行,这是对ReadLine方法的调用:

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

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();
        }
© www.soinside.com 2019 - 2024. All rights reserved.