未设置为对象实例的对象引用.c#

本文关键字:对象引用 实例 对象 设置 | 更新日期: 2023-09-27 18:15:17

我可以从数据库中获取记录并将其作为对象

for (int i = 0; i < selectedFishes.Length; i++)
{
    string stm = "SELECT * FROM Data WHERE name='" + selectedFishes[i] + "'";
    SQLiteCommand cmd = new SQLiteCommand(stm, conn);
    SQLiteDataReader rdr = cmd.ExecuteReader();
    while (rdr.Read())
    {
        fish[i] = new fish(rdr.GetString(0), rdr.GetDouble(1), rdr.GetDouble(2), rdr.GetDouble(3), rdr.GetDouble(4));
        Console.WriteLine(fish[i].name + " " + fish[i].value1 + " " + fish[i].value2 + " " + fish[i].value3 + " " + fish[i].value4);//it can be displayed into console
    }
}
MessageBox.Show(selectedFishes.Length.ToString()+" "+fish.Length.ToString());//results are same if the value >5 cant be displayed
for (int i = 0; i < fish.Length; i++)
{
   Console.WriteLine(fish[i].name + " " + fish[i].value1 + " " + fish[i].value2 + " " + fish[i].value3 + " " + fish[i].value4);
}

为什么不能显示?错误是"对象引用未设置为对象的实例"由于之前

未设置为对象实例的对象引用.c#

我大胆猜测selectedFishes.Length可能不等于fish.Length。确切地说,前者很可能比后者少。

这意味着您只为索引0到selectedFishes.Length-1创建对象,然后尝试访问索引selectedFishes.Length(仍然是null)并导致该异常。

要解决这个问题,您可以更改第二个for循环的上界,或者在其中执行null检查。

编辑:你真的想让while循环在第一个for循环吗?i在while循环中不会改变,所以可以继续将fish对象添加到相同的数组索引中。

我会说总是在NullReferenceException中尝试ToString()每个您期望有值的对象

按f9在第二个控制台写行中添加一个断点。按f5。让程序到达断点。检查name或value1-4是否为空。添加处理空值的代码。