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


正如您现在可能知道的那样,我正在制作一个游戏引擎/框架,并且我一直无法将内容与彼此的引用链接起来。

例子:

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

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

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

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

有谁知道我怎样才能克服这个异常?

有帮助吗?

解决方案

您需要检查entity_entity_.world_entity_.world_.renderer_ - 如果任何这些都是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构造堆叠跟踪指向和无论是调用它,等)

其他提示

那么,有问题的行是

entity_.world_.renderer_.AddComponent(this);

所以无论

entity_.world_

null

entity_.world_.renderer_

null或坏事正在发生的内部

entity_.world_.renderer_.AddComponent

一个堆栈跟踪将有助于我们推断多一点,但这些都是你的罪魁祸首。通过检查开始如果entity_.world_被正确初始化并且如果是这样,如果entity_world_.renderer_被正确初始化。

在一个entity_.world_.renderer_链中的引用为null,这并不奇怪,因为你刚刚在上一行创建它。需要注意的是有一个对象,它的方法添加自己的外部收集是一个奇怪的责任倒置 - 通常无论是谁控制的收集应该得到超过谁加的东西的控制权

我猜尚未被初始化或者world_renderer_基准构件。如果不是这样,entity_作为一个null传递。这是一个有点硬没有更多的信息,告诉他们是什么,但。

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

您可以使用防御代码:

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

除此之外,您需要查看如何构建对象图以确保不会出现这种情况。一个很好的组合 工厂辛格尔顿 在这种情况下,模式可以提供帮助。

也许你有NullReferenceException异常?无论如何,我将仔细检查,无论

entity_.world_

,也不

entity_.world_.renderer_

不为空。只要将一个断点,你会看到你的实体的说法并不完全初始化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top