2012-04-20 4 views
2

Когда я запускаю в режиме отладки мою программу, он выдает исключение NullReferenceException для объекта, который не является нулевым, - он выглядит так, как определено в представлении «Локали». Этот объект является SFML.Graphics.Sprite, и только одно из его полей равно null (myInverseTransform), но когда я проверил другие спрайты, они тоже были пустыми.C# сообщает об объекте как null, когда он не является

Кто-нибудь знает, что может вызвать это, или как я могу найти то, что является нулевым объектом, на которое ссылается исключение?

this is the picture of it

Соответствующий код:

вот код:

(в Sprite :)

public void Draw(RenderTarget target, RenderStates states) 

{ 

    states.Transform *= Transform; 

    RenderStates.MarshalData marshaledStates = states.Marshal(); 

      if (target is RenderWindow) 
      { 
       sfRenderWindow_drawSprite(((RenderWindow)target).CPointer, CPointer, ref marshaledStates); 
      } 
      else if (target is RenderTexture) 
      { 
       sfRenderTexture_drawSprite(((RenderTexture)target).CPointer, CPointer, ref marshaledStates); 
      } 
     } 

(в Transform :)

 public static Transform operator *(Transform left, Transform right) 
     { 
      return new Transform(left).Combine(right); 
     } 

     public Transform Combine(Transform transform) 
     { 
      sfTransform_combine(CPointer, transform.CPointer); 
      return this; 
     } 
      else if (target is RenderTexture) 
      { 
       sfRenderTexture_drawSprite(((RenderTexture)target).CPointer, CPointer, ref marshaledStates); 
      } 
     } 

Проблема при вызове Sprite.Draw this.Transform определяется (согласно представлению Locals), но в операторе Transform * правая переменная имеет значение null;

+0

Показать ваш код, проблема может быть с локальной и глобальной переменной – Likurg

+0

Похоже, что-то вроде дефекта в SFML - доступ к нулевой переменной осуществляется внутренне, и он просто не показывает вас более глубоко, потому что у него нет доступа к исходный код для SFML. – Sander

+0

Я пошел глубже в Draw, но я понял, что во внутреннем вызове (Sprite.Draw) есть строка, в которой говорится state.Transform * = Transform, а в операторе * сказано, что правильное Transform имеет значение null, но в Sprite.Draw this.Transform не является нулевым, так что это все тот же вопрос. – nihohit

ответ

5

Это не означает, что ваше значение переменной равно null. (Объект не может быть пустым - a переменная может иметь нулевое значение, но есть большая разница.) Это просто говорит о том, что произошло NullReferenceException. Например, это может быть ошибка в библиотеке SFML. Вы должны посмотреть на трассировку стека, чтобы узнать, где именно выбрано исключение, и перейти оттуда.

+0

Хм, не были _all_ переменными объектов в C#? –

+1

@MrLister: Нет. Здесь есть отдельные понятия: * переменная *, ее * значение * (которое в данном случае было бы ссылкой) и * объект * (к которому относится значение). Стоит различать их. «Бумага с моим адресом, написанным на ней» - это не то же самое, что «мой адрес», а «мой адрес» - это не то же самое, что «мой дом». –

+0

См. Комментарий к вопросу, который я только что добавил. Я пошел глубже, и это случай, когда переменная non-null передается как null. – nihohit

0

Скорее всего, вы обнаружите, что проблема находится в методе Draw(), где что-то пытается получить доступ к элементам с нулевой переменной - это может быть даже локальная переменная внутри метода.

Вы можете попытаться скомпилировать SFML (это open-source?) Самостоятельно и использовать эту копию, чтобы точно увидеть, что происходит.