C#Server:null检查后立即出现NullReferenceException

时间:2017-01-17 00:03:43

标签: c# server nullreferenceexception

编辑:这不是重复,我知道NullReferenceException意味着什么。

以下代码在空检查后立即给我一个“target”的NullReferenceException:

private Entity  target;
private float   newPathTimer;
private float   attackTimer;

public override void Update(float deltaTime) {
    attackTimer += deltaTime;
    // Check for target
    if (target != null) {
        float   distance    = MathExtra.PointDistance(Entity.X, Entity.Y, target.X, target.Y);

设置“目标”的唯一地方:

public override void Receive(ICommand message) {
    if (message is Attack) {
        target          = SystemMessager.SendQuery<Entity>(new GetEntity(((Attack)message).entityID));
        newPathTimer    = NEW_PATH_RATE;
    }
    if (message is FollowPath) {
        if (!((FollowPath)message).pursuit) {
            target = null;
        }
    }
}

所有对“目标”的引用:

enter image description here

如果它有所不同,此应用程序是一个接收和发送数据包到客户端的服务器。

另外,我不知道如何重现这个错误,它不会一直发生。

编辑:每次收到某个数据包时都会调用receive方法。我认为可能会在单独的线程上收到数据包导致此问题。

1 个答案:

答案 0 :(得分:0)

您的问题似乎是target字段周围缺少锁定或同步。

鉴于您已经说过,当收到数据包时,会在多个线程上调用它,那么只要您读取和写入数据包,就可以使用lock来保护对它的访问。或者,您可能更有可能不打算共享此类的实例及其中的其他字段,因此您可能需要考虑更改这些实例的生命周期。