Получение ошибки: исключение NullReferenceException не было обработано - PullRequest
1 голос
/ 20 ноября 2011
string filename = o.FileName;
string[] textlines = File.ReadAllLines(filename);
string[] mainAndSublines = null;
int i = 0;

foreach(string textline in textlines)
{
   if (textline.Substring(0, 1) != " ")
   {
      i++;
   }

   mainAndSublines[i] = textlines[i];   //Getting error, NullReferenceException was not handled
}

Я получаю тебе ошибку:

исключение NullReferenceException не было обработано

Ответы [ 4 ]

4 голосов
/ 20 ноября 2011

Вы инициализировали mainAndSublines для нуля.

Если вы заранее знаете желаемый размер, используйте это:

string[] mainAndSublines = new string[100];

Если вы заранее не знаете требуемый размер, используйте контейнер с динамическим изменением размера, например, List:

List<string> mainAndSublines = new List<string>();
1 голос
/ 20 ноября 2011

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

Я бы использовал List<String> для строк, не начинающихся с пробела, поскольку вы не можете сказать, сколько их будет, но тогда вы предполагаете , что каждая строка будет не пустой. К счастью, это легко исправить, используя StartsWith.

Я бы , затем использовал бы LINQ, если вы используете .NET 3.5 или выше, что делает все это действительно простым:

List<string> mainAndSublines = File.ReadAllLines(filename)
                                   .Where(x => !x.StartsWith(" "))
                                   .ToList();

В .NET 4 вы можете сделать это более эффективным с точки зрения памяти, используя File.ReadLines вместо File.ReadAllLines - это потоковый файл вместо загрузки всего объекта в память для начала.

1 голос
/ 20 ноября 2011

Просто потому, что ваш массив mainAndSublines равен нулю, и вы не можете получить доступ к элементу массива, который равен нулю ...

0 голосов
/ 20 ноября 2011

Вам также нужно инициализировать второй массив, как вы сделали с первым, вероятно, равным по размеру.

string[] mainAndSublines = new string[textlines.Length];

Но наиболее подходящим решением здесь будет один из них - контейнер с автоматически изменяемым размером.

...