#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()
объекты для каждой записи, прежде чем вы сможете использовать их свойства.