Stream Reader在while循环中读取null

问题描述 投票:0回答:2

使用此方法,我遍历文件,删除其中带有T的行并将它们存储到列表中。在循环结束时,它应该退出,但是它将读取null值并继续传递它,并在引发异常的地方抛出异常“ System.ArgumentNullException:'值不能为null。参数名称:source'“为字符。

*** OpenFile()是使用OpenFileDialog的方法...该方法经过测试,可以在检索和显示所选文件的内容时正常工作。下面的新代码已被更改和更正。

public static List<string> GetToolsFromFile()
    {

        FileStream objFS = new FileStream(OpenFile(), FileMode.Open);
        List<string> list = new List<string>();

        using (StreamReader Sr = new StreamReader(FS))
        {
            char c = 'T';
            string line;
            while ((line = Sr.ReadLine()) != null)
            {

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

            }

            FS.Close();
        }

        return list;
    }
c# while-loop streamreader
2个回答
1
投票

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

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

0
投票

请参阅更正的代码

公共静态列表GetToolsFromFile(){

    FileStream objFS = new FileStream(OpenFile(), 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();
    }

    return list;
}
© www.soinside.com 2019 - 2024. All rights reserved.