1

[解決済み]-間違いは私のもので、World(world_)をエンティティにリンクしなかったため、nullでした。みなさん、説明ありがとうございます!


ご存知かもしれませんが、私はゲームエンジン/フレームワークを作成していて、相互に参照するものをリンクするのに行き詰まっています。

例:

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

レンダラーにコンポーネントを追加する行は、NullObjectExceptionで失敗します。私の考えは、それがクラス実装内にあるためです(オブジェクトがまだ定義されていない場合)が、そのようなことは次のコードで機能しました:

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

コードのその部分もTGSGameクラスの実装内にあります!

誰かがこの例外をどのように克服できるか考えていますか?

4

6 に答える 6

3

をチェックする必要がありますentity_-entity_.world_これらentity_.world_.renderer_のいずれかが存在する場合、それnullは爆発します。これらがオブジェクトにとって基本的なものである場合は、通常、コンストラクターでそれらを初期化し、それらを変更または 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

于 2010-01-19T16:53:01.267 に答える
1

さて、問題のある行は

entity_.world_.renderer_.AddComponent(this);

どちらか

entity_.world_

nullまたは_

entity_.world_.renderer_

内部でnull何か悪いことが起こっている

entity_.world_.renderer_.AddComponent

スタック トレースはもう少し推測するのに役立ちますが、それらはあなたの原因です。が適切に初期化されているかどうかを確認することから始めます。entity_.world_そうであれば、適切entity_world_.renderer_に初期化されています。

于 2010-01-19T16:53:24.700 に答える
1

チェーン内の参照の 1 つentity_.world_.renderer_が null ですが、前の行で作成したばかりなので、これは驚くべきことではありません。オブジェクトを外部コレクションにそのように追加することは、奇妙な責任の逆転であることに注意してください。通常、コレクションを制御している人は誰でも、コレクションに物を追加する人を制御する必要があります。

于 2010-01-19T16:54:14.710 に答える
1

まだ初期化されていないメンバーを参照するか、どちらworld_かを推測します。renderer_またはentity_として渡されnullます。ただし、それらが何であるかについての詳細情報なしで判断するのは少し難しいです。

于 2010-01-19T16:54:30.470 に答える