StreamReader Исключение NullReferenceException


Я создаю функцию, которая будет получать количество строк из 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

Но я получаю ошибку, ' ССЫЛКА на объект не установлена на экземпляр объекта.- Есть ли способ исправить эту ошибку?

EDIT Оказывается, это происходит, когда мой StreamReader равен нулю. Итак, с помощью музефана и предложенного мистером Смитом кода, я пришел к выводу: с этим:

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 3

4 ответа:

Нет необходимости Peek(), это тоже может быть проблемой. Вы можете просто сделать это:

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

Конечно, если вы StreamReader - null, то у вас есть проблема, но одного примера кода недостаточно, чтобы определить это - вам нужно отладить его. Там должно быть много отладочной информации для вас, чтобы понять, какой объект на самом деле null

Звучит как ваш reader Объект null:

Вы можете проверить, является ли читатель нулевым, выполнив:

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

Чуть более аккуратный вариант предложенного musefan кода; только один код ReadLine (). +1 для предложения удаления проверки длины кстати.

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

В вашем коде недостаточно информации для решения проблемы. Я сделал небольшое приложение с базой VS 2010 на моем предположении, и оно хорошо работает. Я считаю, что ваш код получить проблему с streamReader. Если streamReader имеет значение null, ваш код будет выдавать ссылку ' Object, не заданную для экземпляра объекта.' Вы должны проверить, что streamReader не равен null, и убедиться, что streamReader доступен.

Вы можете ссылаться на код ниже. С помощью убедитесь, что TextFile1.txt существующий в D:\ Надеюсь, что это помощь.

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