Нулевая ссылка на кажущийся ненулевым объект

#c# #asp.net #nullreferenceexception

#c# #asp.net #исключение nullreferenceexception

Вопрос:

Сначала вот мой код:

Я прокомментировал проблемные строки

 protected void Page_Load(object sender, EventArgs e)
    {
        StreamReader reader = new StreamReader(Request.PhysicalApplicationPath    "/directory.txt");
        int i = 0;
        int c = 0;
        int d = 0;
        List<string> alst = new List<string>();
        List<string> nlst = new List<string>();
        TableRow[] row = new TableRow[100];
        TableCell[] cella = new TableCell[100];
        TableCell[] cellb = new TableCell[100];
        while (reader.Peek() > 0)
        {
            alst.Add(reader.ReadLine());
            nlst.Add(reader.ReadLine());
            d  ;
        }
        foreach (string line in nlst)
        {
            if (i < d   1)
            {
                cella[i].Text = nlst[i]; //this line
                cellb[i].Text = alst[i]; //and this line always return a null return a null reference when ran
                i  ;
            }
        }
        do
        {
            row[c].Cells.Add(cella[c]);
            row[c].Cells.Add(cellb[c]);
            c  ;
        } while (c != cella.Count());
        foreach (TableRow item in row)
        {
            Table1.Rows.Add(item);
        }
    }
  

Я проверил, и все задействованные переменные не равны нулю. Я попытался очистить решение. Я также пытался ввести статические значения для i (например, 0), по-прежнему ничего.

Я смотрел на эту штуку как минимум 2 часа, меняя циклы, если и другие вещи, и все еще не могу в этом разобраться.

Заранее спасибо, Адам

Комментарии:

1. В качестве дополнительного примечания, вам лучше использовать using block для правильной утилизации StreamReader , иначе есть риск оставить файл заблокированным и даже утечки памяти.

Ответ №1:

 TableCell[] cella = new TableCell[100];
TableCell[] cellb = new TableCell[100];
  

Это создает массив, но не инициализирует его значения. Итак

 cella[i].Text = nlst[i];
cellb[i].Text = alst[i];
  

сбой, потому что cella[i] всегда null и .Text не существует (то же самое относится к cellb[i] ).

Сначала вам придется инициализировать свой массив или сгенерировать новый объект TableCell в вашем цикле

 cella[i] = new TableCell { Text = nlst[i] };
cellb[i] = new TableCell { Text = alst[i] };
  

Кроме того:

  • Рассмотрите возможность использования LINQ для обработки операций со списками и
  • Попробуйте переименовать свои переменные в более значимые. cellb[i] = new TableCell { Text = alst[i] }; для меня похоже на ошибку — N переходит в ячейку A и A переходит в ячейку B ?
  • Используйте using инструкцию при обработке потоков (и других IDisposable объектов). Это гарантирует, что поток находится в правильном расположении — даже при возникновении ошибок.
 используя(var reader = new StreamReader(Запрос.PhysicalApplicationPath   "/directory.txt ");) 
 {
 // ваш код для нее ... 
 }

Ответ №2:

Когда вы объявляете, TableCell[] cella = new TableCell[100]; вы создаете массив из 100 ссылок на TableCell , все из которых являются null . При попытке выполнить cella[i].Text = nlst[i]; , cella[i] является null , поэтому вы получаете исключение при попытке присвоить null.Text .

Похоже, вам нужен цикл для заполнения значений для всех элементов cella и cellb .

Комментарии:

1. Иногда я чувствую себя действительно глупо… Я должен был подумать об этом. Спасибо вам за помощь.

Ответ №3:

Вы никогда не создаете экземпляры TableCell объектов в этом массиве; вы только создаете экземпляр самого массива. Вам необходимо создать new TableCell() объекты для каждой записи, прежде чем вы сможете использовать их свойства.