使变量成为必需的 - 以避免 NullReferenceException?
-
21-09-2019 - |
题
[已解决] - 错误是我的,我没有将世界(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
传递。这是一个有点硬没有更多的信息,告诉他们是什么,但。
也许你有NullReferenceException异常?无论如何,我将仔细检查,无论
entity_.world_
,也不
entity_.world_.renderer_
不为空。只要将一个断点,你会看到你的实体的说法并不完全初始化。