迭代StreamReader列表时出现空引用异常

时间:2013-11-01 09:39:27

标签: c# file file-io

我想在40-50个长文件中找到一个特定的字符串。为此,我使用了以下代码: -

    foreach(StreamReader SR in FileList)
    {
       // Process the file
    }
    // File List contains initialized instances of StreamReader class

这样做我收到了

       null reference exception

虽然,当

    FileList 

只包含1个元素,代码工作正常。可能的原因是什么以及如何纠正? 我已经创建了这样的函数,它初始化文件并将它们添加到FileList:

    public static void Initialize()
    {
      StreamReader File1 = new StreamReader("some valid path here",false, Encoding.UTF8) ; 
       FileList.Add(File1) ; 
       // Similarly for other files.
    } 

foreach循环中的代码是: -

    foreach( StreamReader SR in FileList)
    {
      while (!SR.EndOfStream)
      {
          Content = SR.ReadLine() ; 
          if(Content.Contains(Name))
          {
           Console.WriteLine("Found");
          }
       }
     } 
      // Content and Name are other string variable declared previously in the program

正如有些人指出错误可能是由变量内容引起的,我想澄清一下情况并非如此。

4 个答案:

答案 0 :(得分:1)

可以通过,因为FileList为null并且不包含任何元素。当然这会引发异常。 在调用foreach之前,您应该检查它是否为null。 ..或者只是使用new之前在某处创建FileList,以填充它。

答案 1 :(得分:1)

检查您的Content变量是否为null,因为如果SR.EndOfStream为空且未读取,SR可能未正确设置。

如果可能,FileList中有空条目,请将SR检查为空。

foreach( StreamReader SR in FileList)
{
  if(SR == null) continue;

  while (!SR.EndOfStream)
  {
      Content = SR.ReadLine() ; 
      if(Content != null && Content.Contains(Name))
      {
       Console.WriteLine("Found");
      }
   }
 } 

答案 2 :(得分:1)

来自StreamReader

的文档
  

输入流的下一行,如果到达输入流的末尾,则为null。

所以你正在阅读传递流的末尾,将内容设置为null。

你应该改变你的循环逻辑

    while ((Content = SR.ReadLine()) != null)
    {
        if (Content.Contains(Name))
        {
            Console.WriteLine("Found");
        }
    }

但是我建议这样做不同

var paths = //set to a list of file paths
var findings = from path in paths
               from line in System.IO.File.ReadAllLines(path)
               where line.Contains(name)
               select line

这将为您提供包含名称

中的字符串的所有行

答案 3 :(得分:1)

有一个非常好用且安全的方法File.ReadLines(不要与File.ReadAllLines混淆)

它不会读取文件的整个内容,但每次调用都会加载一行

foreach (string path in paths)
{
    foreach (string line in File.ReadLines(path))
    {
        if (line.Contains(Name))
        {
            Console.WriteLine("found");
            break;
        }
    }
}