变量是必需的 - 逃避NullReferenceException?

时间:2010-01-19 16:50:12

标签: c# object reference nullreferenceexception game-engine

[求助] - 错误是我的,我没有将World(world_)链接到实体,因此它是null。感谢大家的解释!


正如你现在所知道的那样,我正在制作一个游戏引擎/框架,并且我已经卡住了彼此引用的东西。

示例:

public void Attach(Entity Entity)
{
    entity_ = Entity;
    entity_.world_.renderer_.AddComponent(this);
}

将组件添加到渲染器的行因NullObjectException而失败。 我的想法是因为它在类实现中(当对象尚未定义时),但这样的东西在下一段代码中起作用:

public TGSGame()
{
    ...
    Renderer = new RenderManager(this);
    ...
}

这部分代码也在TGSGame类实现中!

有谁知道如何克服这个例外?

6 个答案:

答案 0 :(得分:3)

您需要检查entity_entity_.world_entity_.world_.renderer_ - 如果任何这些<{1}}它将会爆炸。如果这些是对象的基础,那么在构造函数中初始化它们通常是个好主意,并限制它们是否可以更改/设置为null。例如:

null

这样做的好处是,public class Entity { public World World {get;private set;} public Entity(World world) { if(world == null) throw new ArgumentNullException("world"); tihs.World = world; } } 参数的问题显而易见(它将显示为ArgumentNullException,并且堆栈跟踪指向{{1}构造函数和任何调用它的东西,等等)

答案 1 :(得分:1)

嗯,违规行是

entity_.world_.renderer_.AddComponent(this);

所以

entity_.world_

null

entity_.world_.renderer_

null

内发生的不好的事情
entity_.world_.renderer_.AddComponent

堆栈跟踪可以帮助我们推断出更多,但那些是你的罪魁祸首。首先检查是否正确初始化了entity_.world_,如果entity_world_.renderer_正在初始化,则检查是否正确。

答案 2 :(得分:1)

entity_.world_.renderer_链中的一个引用为null,这并不奇怪,因为您刚刚在上一行中创建了它。请注意,让一个对象以自己的方式添加到外部集合中是一个奇怪的责任倒置 - 通常谁控制集合应该控制谁添加东西。

答案 3 :(得分:1)

我猜测尚未初始化的world_renderer_引用成员。这个或entity_作为null传入。虽然没有更多关于它们的信息,但有点难以辨别。

答案 4 :(得分:1)

在调用Attach之前,您需要确保“world_”和“renderer_”都存在。

您可以使用防御性代码:

if ((entity_ != null) && (entity_.world_ != null) && (renderer_ != null)) {
   //... your code here...
} else {
   throw new Exception("...");
}

除此之外,您还需要了解如何构建对象图以确保不会出现这种情况。在这种情况下,FactorySingleton模式的良好组合可以提供帮助。

答案 5 :(得分:1)

也许你有NullReferenceException?无论如何,我会仔细检查一下

entity_.world_

,也不

entity_.world_.renderer_

不为空。只需放置一个断点,您就会看到您的Entity参数未完全初始化。