对明显非空对象的空引用

本文关键字:对象 引用 | 更新日期: 2023-09-27 17:49:54

首先是我的代码:

我已经注释了问题行

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个小时,换了循环、if和其他东西,但仍然不能弄清楚。

提前感谢,亚当

对明显非空对象的空引用

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

创建Array,但不初始化Array的值。所以

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去细胞AA去细胞B ?
  • 使用using语句处理流(和其他IDisposable对象)。这可以确保流被正确处理——即使发生错误。
<>之前使用(var reader = new StreamReader)PhysicalApplicationPath + "/directory.txt");{//你的代码…}

当您声明TableCell[] cella = new TableCell[100];时,您正在创建一个包含100个TableCell引用的数组,所有这些引用都是null。如果你试图执行cella[i].Text = nlst[i];, cella[i]null,所以当你试图分配null.Text时,你会得到一个异常。

听起来你需要一个循环来为cellacellb的所有元素填充值。

您从未在该数组中实例化TableCell对象;您只是在实例化数组本身。在使用每个条目的属性之前,需要为它们创建new TableCell()对象。