2017-01-17 5 views
-1

Edit: das ist kein Duplikat, ich weiß, was eine NullReferenceException bedeutet.C# Server: NullReferenceException direkt nach Null-Prüfung

Der folgende Code ist mir eine Nullreferenceexception für "Ziel" direkt nach einem Null-Check geben:

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); 

die einzigen Orte, wo "Ziel" gesetzt ist:

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; 
     } 
    } 
} 

Alle Verweise auf " Ziel ":

enter image description here

Wenn es macht ein ny Unterschied, diese Anwendung ist ein Server, der Pakete an Clients empfängt und sendet.

Auch ich weiß nicht, wie man diesen Fehler reproduziert, es passiert nicht die ganze Zeit.

Bearbeiten: Die Empfangsmethode wird jedes Mal aufgerufen, wenn ein bestimmtes Paket empfangen wird. Ich denke Pakete können in einem separaten Thread empfangen werden, der dieses Problem verursacht.

+1

Kann es sein, dass 'target' von anderen Threads mutiert ist? Angesichts der Tatsache, dass es nicht immer passiert, klingt dies wie eine Race Condition. – Stuart

+0

Was ist null und nichtig, Nachricht? – ArthNRick

+0

versuchen, eine Sperre zu verwenden – Nkosi

Antwort

0

Ihr Problem scheint ein Mangel an Sperren oder Synchronisierung um das Feld target zu sein.

Gegeben wie Sie gesagt haben, dass dies an mehreren Threads aufgerufen wird, wenn Pakete empfangen werden, dann könnten Sie lock verwenden, um Zugriff darauf zu schützen, wann immer Sie lesen und schreiben. Wahrscheinlich ist es auch wahrscheinlicher, dass Sie nicht beabsichtigen, die Instanz dieser Klasse und andere Felder darin zu teilen. Daher müssen Sie möglicherweise die Lebensdauer dieser Instanzen ändern.

Verwandte Themen