C # NullReferenceException было необработанным - PullRequest
0 голосов
/ 18 марта 2011

Я пытаюсь использовать анализатор CSV, который я нашел в сети в своем проекте.Проблема в том, что я получаю исключение нулевой ссылки, когда пытаюсь преобразовать строку в тег, а моя коллекция не заполняется.Кто-нибудь может помочь?Спасибо

CSV Parser

private static IEnumerable<string[]> parseCSV(string path)
    {
        List<string[]> parsedData = new List<string[]>();

        try
        {
            using (StreamReader readFile = new StreamReader(path))
            {
                string line;
                string[] row;

                while ((line = readFile.ReadLine()) != null)
                {
                    row = line.Split(',');
                    parsedData.Add(row);
                }
            }
        }
        catch (Exception e)
        {
            System.Windows.MessageBox.Show(e.Message);
        }

        return parsedData;
    }

Tag Class

  public class Tag
    {
        public Tag(string name, int weight)
        {
            Name = name;
            Weight = weight;
        }

        public string Name { get; set; }
        public int Weight { get; set; }

        public static IEnumerable<Tag> CreateTags(IEnumerable<string> words)
        {
            Dictionary<string, int> tags = new Dictionary<string, int>();

            foreach (string word in words)
            {
                int count = 1;
                if (tags.ContainsKey(word))
                {
                    count = tags[word] + 1;
                }

                tags[word] = count;
            }

            return tags.Select(kvp => new Tag(kvp.Key, kvp.Value));
        }
    }

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

Проверьте все аргументы метода, прежде чем использовать их!

Разрывается на этой строке: foreach (строковое слово в словах)

Помните, что foreach зацикливает работу, вызывая GetEnumerator для повторяющейся коллекции. То есть ваш цикл foreach вызывает вызов words.GetEnumerator, и этот вызов завершается ошибкой, если words равен нулю.

Следовательно, проверьте ваш аргумент words, добавив охрану в самом начале вашего CreateTags метода:

if (words == null)
{
    throw new ArgumentNullException("words");
}

Это поможет вам найти местоположение в вашем коде, где null передается в CreateTags, и затем вы сможете продолжить исправление вызывающего кода.

Предложение: по возможности избегайте null.

Как очень общее правило, старайтесь по возможности избегать использования значений null. Например, когда ваш код имеет дело с наборами и коллекциями элементов, вы можете убедиться, что он также работает правильно с пустыми коллекциями. На втором этапе убедитесь, что вы никогда не используете null для представления пустой коллекции; вместо этого используйте, например, Генератор Enumerable.Empty<TItem>() LINQ для создания пустой коллекции.

Единственное место, где вы могли бы начать это делать, - это метод CreateTags, гарантирующий, что независимо от того, какие будут входные данные, этот метод всегда будет возвращать действительную ненулевую (но, возможно, пустую) коллекцию:

if (words == null)
{
    return Enumerable.Empty<Tag>();  // You could do without LINQ by writing:
                                     // return new Tag[] { };
}
0 голосов
/ 18 марта 2011

Каждый метод должен запускать проверки работоспособности принимаемых им аргументов, чтобы убедиться, что аргументы являются допустимыми входными параметрами. Я бы, наверное, сделал что-то вроде

public static IEnumerable<Tag> CreateTags(IEnumerable<string> words)
    {
        if(words==null)
        {
           //either throw a new ArgumentException or
           return null; //or return new Dictionary<string,int>();
        }
        Dictionary<string, int> tags = new Dictionary<string, int>();

        foreach (string word in words)
        {
            int count = 1;
            if (tags.ContainsKey(word))
            {
                count = tags[word] + 1;
            }

            tags[word] = count;
        }

        return tags.Select(kvp => new Tag(kvp.Key, kvp.Value));
    }

Что касается того, почему ваш параметр "words" имеет значение null, было бы полезно увидеть файл CSV, в котором вы пытаетесь разобрать.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...