1

[已解决] - 错误是我的,我没有将 World (world_) 链接到实体,所以它是空的。谢谢大家的解释!


正如您现在可能知道的那样,我正在制作一个游戏引擎/框架,并且我已经卡住了将东西与相互引用联系起来。

例子:

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

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

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

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

有谁知道我该如何克服这个异常?

4

6 回答 6

3

您需要检查entity_entity_.world_并且entity_.world_.renderer_- 如果有任何一个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参数"world"的 , 堆栈跟踪指向World构造函数以及调用它的任何内容等)

于 2010-01-19T16:53:01.267 回答
1

好吧,有问题的线是

entity_.world_.renderer_.AddComponent(this);

所以要么

entity_.world_

null

entity_.world_.renderer_

null或内部发生了不好的事情

entity_.world_.renderer_.AddComponent

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

于 2010-01-19T16:53:24.700 回答
1

链中的一个引用entity_.world_.renderer_为空,这并不奇怪,因为您刚刚在上一行中创建了它。请注意,让对象以这种方式添加到外部集合是一种奇怪的责任倒置——通常控制集合的人应该控制向其中添加内容的人。

于 2010-01-19T16:54:14.710 回答
1

我猜要么world_renderer_参考尚未初始化的成员。要么 要么entity_作为null. 如果没有更多关于它们是什么的信息,这有点难以判断。

于 2010-01-19T16:54:30.470 回答
1

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

您可以使用防御性代码:

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

除此之外,您需要查看如何构建对象图以确保不会出现这种情况。在这种情况下,工厂模式和单例模式的良好组合会有所帮助。

于 2010-01-19T16:56:53.020 回答
1

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

entity_.world_

也不

entity_.world_.renderer_

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

于 2010-01-19T16:58:48.493 回答