StreamReader NullReferenceException

时间:2013-04-22 15:14:53

标签: c# nullreferenceexception streamreader

我正在创建一个函数,它将从StreamReader中获取除注释(以'//'开头的行)和新行的行数。

这是我的代码:

private int GetPatchCount(StreamReader reader)
    {
        int count = 0;

            while (reader.Peek() >= 0)
            {
                string line = reader.ReadLine();
                if (!String.IsNullOrEmpty(line))
                {
                    if ((line.Length > 1) && (!line.StartsWith("//")))
                    {
                        count++;
                    }
                }
            }

        return count;
    }

我的StreamReader的数据是:

// Test comment

但是我收到一个错误,'对象引用未设置为对象的实例。'有没有办法解决这个错误?

修改 当我的StreamReader为null时,会发生这种情况。因此,对于musefan和史密斯先生建议的代码,我想出了这个:

private int GetPatchCount(StreamReader reader, int CurrentVersion)
    {
        int count = 0;
            if (reader != null)
            {
            string line;
            while ((line = reader.ReadLine()) != null)
                if (!String.IsNullOrEmpty(line) && !line.StartsWith("//"))
                    count++;
            }
        return count;
    }

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

听起来reader对象为null

您可以通过执行以下操作检查读者是否为空:

if (reader == null) {
   reader = new StreamReader("C:\\FilePath\\File.txt");
} 

答案 1 :(得分:1)

没有必要Peek(),这实际上也可能是问题所在。你可以这样做:

string line = reader.ReadLine();
while (line != null)
{
    if (!String.IsNullOrEmpty(line) && !line.StartsWith("//"))
    {
        count++;
    }
    line = reader.ReadLine();
}

当然,如果你StreamReader为null,那么你就会遇到问题,但仅凭示例代码还不足以确定这一点 - 你需要调试它。应该有足够的调试信息来确定哪个对象实际为空

答案 2 :(得分:1)

musefan建议的代码略微更整洁;只需一个ReadLine()代码。 +1表示删除长度检查btw。

private int GetPatchCount(StreamReader reader)
{
    int count = 0;
    string line;
    while ((line = reader.ReadLine()) != null)
        if (!String.IsNullOrEmpty(line) && !line.StartsWith("//"))
            count++;
    return count;
}

答案 3 :(得分:0)

您的代码不足以解决您的问题。基于我的假设,我已经根据VS 2010做了一个小应用程序,它运行良好。我相信你的代码会遇到streamReader的问题。如果streamReader为null,则代码将抛出“对象引用未设置为对象的实例”。 您应该检查streamReader是否为null并确保streamReader可用。

您可以参考下面的代码。确保在D:\中存在TextFile1.txt 希望这有帮助。

namespace ConsoleApplication1
{
using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        using (StreamReader streamReader = new StreamReader(@"D:\\TextFile1.txt"))
        {
            int count = GetPatchCount(streamReader);
            Console.WriteLine("NUmber of // : {0}",  count);
        }

        Console.ReadLine();
    }

    private static int GetPatchCount(StreamReader reader)
    {
        int count = 0;

        while (reader.Peek() >= 0)
        {
            string line = reader.ReadLine();
            if (!String.IsNullOrEmpty(line))
            {
                if ((line.Length > 1) && (!line.StartsWith("//")))
                {
                    count++;
                }
            }
        }

        return count;
    }
}
}