对明显非空对象的空引用

时间:2011-04-10 13:51:33

标签: 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个小时,改变循环,ifs和其他东西,但仍然无法解决。

提前致谢, 亚当

3 个答案:

答案 0 :(得分:4)

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

这会创建一个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语句。这样可以确保正确处理流 - 即使出现错误。
    using(var reader = new StreamReader(Request.PhysicalApplicationPath +  "/directory.txt");) 
    {
        // your code her ... 
    }

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您永远不会在该数组中实例化TableCell个对象;你只是实例化数组本身。您需要为每个条目创建new TableCell()个对象,然后才能使用它们的属性。