【问题标题】:C# Object Reference not set to an instance of an object error [duplicate]C#对象引用未设置为对象错误的实例[重复]
【发布时间】:2025-12-16 04:55:01
【问题描述】:

当我在 Add 方法期间运行此代码时,我收到标题中的错误。 Add 方法应该将游戏对象添加到名为 queue 的列表中。
GameObject 是一个类。
GameManager 也是一个类。
queue 是一个列表。

我认为这是唯一相关的代码。

    static void Main()
    {
        GameObject obj1 = new GameObject();
        GameManager manager1 = new GameManager();
        obj1.name = "First";
        manager1.Add(obj1);
        manager1.Process();
    }

    public void Add(GameObject gameObject)
    {
        gameObject.initialize = true;
        queue.Add(gameObject);
    }

【问题讨论】:

  • 你有没有初始化列表?此外,Queue 可能比 List 更合适。
  • 哪一行导致错误?
  • 你调试过,发现什么是null?
  • NullReferenceException 的几乎所有情况都是相同的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。

标签: c# nullreferenceexception


【解决方案1】:

尝试初始化“队列”字段

  • 它可能从未初始化,因此出现Object Reference not set to an instance of an object error 错误,根据Add 方法的结构,它很可能对应于queue

  • 另外 - 我会考虑将队列重命名为有意义的名称,因为它目前具有欺骗性。

这是一个初始化建议,它适用于您在问题中描述的 List,但可以轻松修改为对应于任何 IEnumerable ,此外,它可以在 @987654325 之前执行的不同方法中完成@(再次,从你的代码看起来不太可能):

private List<GameObject> queue; // assuming it's private, doesn't really matter either way.

static void Main()
{
    queue = new List<GameObject>(); // the missing line
    GameObject obj1 = new GameObject();
    GameManager manager1 = new GameManager();
    obj1.name = "First";
    manager1.Add(obj1);
    manager1.Process();
}


public void Add(GameObject gameObject)
{
    gameObject.initialize = true;
    queue.Add(gameObject);
}

【讨论】:

  • 你怎么知道队列是一个列表可能是一个字典或其他什么?
  • 你有没有考虑过队列其实是一个System.Collections.Generics.Queue?
  • 它在 OP 描述中 - “队列是一个列表”,无论哪种方式,我都会添加说明,因为它是什么类型的 IEnumerable 并不重要,都需要初始化:)
  • 感谢修复。应该更多地研究列表。
  • 所以他很抱歉@Ron B.
【解决方案2】:

你需要调试你的代码。

我假设您使用的是 Visual Studio,如果是,请执行以下操作:

  1. 转到“调试”菜单。

  2. 单击“例外...”选项。

应该会出现以下对话框:

注意:公共语言运行时异常复选框已选中。

单击“确定”后,现在当您在代码或 .NET Framework 引发异常时调试代码时,调试器将在引发异常的行停止。这样可以更轻松地找到“损坏”的地方。

【讨论】:

  • 这只会真正帮助捕获/处理/吞噬的异常。对于像 OP 所述的未处理异常,调试器无论如何都会中断。
  • @MattDavey - 不,一旦抛出异常就会中断;不是当它一直冒泡时。
  • 我明白这一点,但对于未处理的异常,您不会通过这样做看到任何行为差异。无论如何,调试器仍然会在引发异常的那一行中断。
【解决方案3】:

你必须先初始化队列列表

【讨论】:

    最近更新 更多