2010-01-19 59 views
1

[已解決] - 錯誤是我的,我沒有將世界(world_)鏈接到實體,所以這是空的。感謝大家的解釋!現在你可能已經知道,我正在製作一個遊戲引擎/框架,而且我已經把對象與引用鏈接起來。做一個變量是必需的 - 逃避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它就會爆炸。如果這些對象是基本的,那麼在構造函數中初始化它們通常是一個好主意,並限制它們是否可以更改/設置爲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

非這些都是空的,我一步一步檢查和debuged。但是當我通過'this'作爲參數時,問題也出現在一段測試代碼中。另一點需要注意的是,代碼中的例外情況出現在遊戲部件所依賴的庫中,這可能是一個問題嗎? (思想例外只與DLL中的代碼引起) – Johnny 2010-01-19 16:58:24

+0

@Johnny - 如果沒有這些東西都是'null',那麼問題是,你是不是向我們展示代碼(大概裏面'AddComponent')。你看過堆棧跟蹤嗎? (例如通過捕獲「例外」)。堆棧跟蹤是什麼樣的? – 2010-01-19 17:35:20

+0

問題不在AddComponent中,它是將世界鏈接到實體的部分。感謝您的幫助和快速解答! – Johnny 2010-01-19 17:55:44

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_鏈中的參考之一是null,這並不奇怪,因爲您剛剛在上一行中創建了它。請注意,有一個對象添加到外部集合的方式是一種奇怪的責任倒置 - 通常控制集合的任何人都應該控制誰向它添加事物。

1

我猜想world_renderer_尚未初始化的參考成員。或者entity_作爲null被傳入。如果沒有更多關於它們的信息,有點難以分辨。

1

您需要確保在調用Attach之前「world_」和「renderer_」都存在。

你可以使用防禦代碼:

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

除此之外,你需要看你如何建立你的對象圖,以確保這種情況不會出現。在這種情況下,FactorySingleton模式的良好組合可以提供幫助。

1

也許你有NullReferenceException?無論如何,我會仔細檢查,無論是

entity_.world_ 

也不

entity_.world_.renderer_ 

不爲空。只要放置一個斷點,你就會發現你的Entity參數沒有完全初始化。