【问题标题】:StreamReader reads null in while loopStreamReader 在 while 循环中读取 null
【发布时间】:2020-03-26 02:33:50
【问题描述】:

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

System.ArgumentNullException: '值不能为空。参数名称: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 的方法。在检索和显示所选文件的内容时,它已经过测试并正常工作。

【问题讨论】:

  • OpenFile() 是一种使用它的方法。它打开并读取文件。它显示了我需要存储的每一行。当涉及到文件末尾时,它会抛出异常。
  • 如果OpenFile() 返回null 怎么办?在继续之前,您应该检查一下。
  • JQSOFT 如果 OpenFile() 返回 null 那么它将如何读取我选择的文件?感谢您的努力,但 Youssef13 为我解决了这个问题。
  • @SnoopDog 您不应该将解决方案编辑到您的问题中。这就是接受答案的目的,现在这个问题在提供已经有效的代码时对未来的读者来说没有意义。

标签: c# while-loop streamreader argumentnullexception


【解决方案1】:

您调用 ReadLine 方法 两次 次。第一次在 while 循环条件中,第二次在 while 主体内。假设你的文件是 3 行,这里是对 ReadLine 方法的调用:

  1. 在循环条件下,它读取第一行。
  2. 在循环体中,它读取第二行并将其分配给line 变量。
  3. 在循环条件中,它读取第三行(也就是最后一行)。
  4. 在循环体中,它返回空值,因此您的line 变量被分配给空值,然后您在空字符串上调用Contains 方法。例外就是这么说的。

【讨论】:

  • 我试过删除但是第一个使用 != 是布尔值。如果我使用 while (line = Sr.ReadLine() != null) 我会收到一条错误消息,指出无法将 bool 隐式转换为字符串。
  • @SnoopDog,您需要包含括号。 while ((line = Sr.ReadLine()) != null).
  • 添加额外的括号更正了问题。感谢您的帮助
  • 不知道为什么有人投了反对票。它解决了问题,如您所说更正它。谢谢
  • +1 用于解释什么是错误的以及当ReadLine() 被这样调用时会发生什么。如果这可以解释或显示如何解决它会很好,尽管我认为这两个答案一起提供了代码和解释。
【解决方案2】:

请查看更正后的代码

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

【讨论】:

  • 这个每次都返回空,根本不读取文件。
猜你喜欢
  • 2011-03-05
  • 1970-01-01
  • 2017-12-09
  • 2018-04-17
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
相关资源
最近更新 更多