2010-01-19 2 views
1

[SOLVED] - Ошибка была моей, что я не связывал World (world_) с сущностью, так что это было null. Спасибо за объяснение всем!Требуется переменная - чтобы избежать исключения NullReferenceException?


Как вы уже знаете, я делаю движок игры/рамки, и я застрял связывая материал со ссылками друг на друга.

Пример:

public void Attach(Entity Entity) 
{ 
    entity_ = Entity; 
    entity_.world_.renderer_.AddComponent(this); 
} 

линия, которая добавляет компонент к визуализатору терпит неудачу с NullObjectException. Моя идея состояла в том, что это потому, что внутри реализации класса (если объект еще не определен), но такая вещь работала в следующем фрагменте кода:

public TGSGame() 
{ 
    ... 
    Renderer = new RenderManager(this); 
    ... 
} 

Та часть кода находится внутри реализации класса TGSGame слишком !

У кого-нибудь есть идея, как я могу преодолеть это исключение?

ответ

3

Вы должны проверить 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 конструктору и то, что назвав его, и т.д.)

+0

Не из этих значений null, я проверял и отлаживал шаг за шагом. Но проблема возникла и в куске тестового кода, когда я передал «это» в качестве параметра. Еще одно замечание: код, в котором есть исключение, находится в библиотеке, на которой зависит игровая часть, может быть, это может быть проблемой? (Мысль, что исключение возникает в коде, относящемся только к dll) – Johnny

+0

@Johnny - если ни одна из этих вещей не является «нулевой», тогда проблема заключается в коде, который вы не показываете нам (предположительно внутри 'AddComponent'). Вы посмотрели на трассировку стека? (например, поймав «Исключение»). Как выглядит трассировка стека? –

+0

Проблема не в AddComponent, это было в части для связывания World to Entity. Спасибо за помощь и быстрый ответ! – Johnny

1

Ну, мешающий линия

entity_.world_.renderer_.AddComponent(this); 

так как

entity_.world_ 

является null или

entity_.world_.renderer_ 

является null или что-то плохое происходит внутри

entity_.world_.renderer_.AddComponent 

Стек след помог бы нам вывести немного больше, но это ваши виновниками. Начните с проверки правильности инициализации entity_.world_, и если да, то правильно инициализируется entity_world_.renderer_.

1

Одна из ссылок в цепочке entity_.world_.renderer_ является нулевой, что неудивительно, поскольку вы только что создали ее в предыдущей строке. Обратите внимание, что если объект добавляет себя таким образом во внешнюю коллекцию, это необычная инверсия ответственности - обычно тот, кто контролирует коллекцию, должен получить контроль над тем, кто добавляет к ней вещи.

1

Я бы предположил либо world_, либо renderer_ ссылочные элементы, которые еще не были инициализированы. Либо это, либо entity_ передается как null. Это немного сложно сказать, не говоря уже о том, что они собой представляют.

1

Необходимо, чтобы «world_» и «renderer_» существовали до вызова Attach.

Вы можете использовать оборонительный код:

if ((entity_ != null) && (entity_.world_ != null) && (renderer_ != null)) { 
    //... your code here... 
} else { 
    throw new Exception("..."); 
} 

Помимо этого, вы должны смотреть на то, как вы строите свой график объекта для того, чтобы эта ситуация не возникает. Хорошее сочетание модели Factory и Singleton может помочь в этом случае.

1

Возможно, у вас было исключение NullReferenceException? Во всяком случае, я бы перепроверить, что ни

entity_.world_ 

ни

entity_.world_.renderer_ 

не является нулевым. Просто поместите точку останова, и вы увидите, что ваш аргумент Entity не полностью инициализирован.