[求助] - 错误是我的,我没有将World(world_)链接到实体,因此它是null。感谢大家的解释!
正如你现在所知道的那样,我正在制作一个游戏引擎/框架,并且我已经卡住了彼此引用的东西。
示例:
public void Attach(Entity Entity)
{
entity_ = Entity;
entity_.world_.renderer_.AddComponent(this);
}
将组件添加到渲染器的行因NullObjectException而失败。 我的想法是因为它在类实现中(当对象尚未定义时),但这样的东西在下一段代码中起作用:
public TGSGame()
{
...
Renderer = new RenderManager(this);
...
}
这部分代码也在TGSGame类实现中!
有谁知道如何克服这个例外?
答案 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("...");
}
除此之外,您还需要了解如何构建对象图以确保不会出现这种情况。在这种情况下,Factory和Singleton模式的良好组合可以提供帮助。
答案 5 :(得分:1)
也许你有NullReferenceException?无论如何,我会仔细检查一下
entity_.world_
,也不
entity_.world_.renderer_
不为空。只需放置一个断点,您就会看到您的Entity参数未完全初始化。