2011-08-20 80 views
0

我有下面的代碼:爲什麼我的代碼忽略了一個真正的if條件?

private static void checkCodesInPlayerCenter(GameObject player) 
    { 
     Vector2 collisionCenter = player.GetCollisionCenter(player.PublicCollisionRectangle); 

     if (TileMap.GetMapSquareAtPixel(collisionCenter) == null) 
     { 
      return; 
     } 

     for (int i = 0; i < TileMap.GetMapSquareAtPixel(collisionCenter).Codes.Count; ++i) 

這是可能的,有時我從GetMapSquareAtPixel獲取對象爲空。爲了不導致for循環中的NullReferenceException,我決定檢查它是否爲null,如果是,儘早結束函數,但是它似乎完全忽略了if條件,即使返回的對象爲null。 我在return語句上設置了一個斷點,但代碼永遠不會去那裏,而是觸發NullReferenceException,我試圖避免。

請幫忙嗎?

+0

也許'TileMap'爲空。可能?或'代碼'?或'玩家'? –

+1

它可能是空的collisionCenter? – darma

+0

當方法內的第一行調用時,是否得到任何結果? – saber

回答

2

這是可能的

TileMap.GetMapSquareAtPixel(collisionCenter) 

不爲空,但

TileMap.GetMapSquareAtPixel(collisionCenter).Codes 

是。如果是這種情況,那麼

TileMap.GetMapSquareAtPixel(collisionCenter).Codes.Count 

將失敗並出現NullReferenceException。

您需要在添加到您的守衛條件:

if (TileMap.GetMapSquareAtPixel(collisionCenter) == null || 
     TileMap.GetMapSquareAtPixel(collisionCenter).Codes == null) 
    { 
     return; 
    } 
+0

這和@ anthony-sottile的解決方案是正確的。 基本上第一次調用(當檢查時)從未返回null(因爲它應該是這種情況),但我的確確實際更改了代碼列表中的元素,並且不知道列表會自動變爲null,如果刪除後沒有更多元素最後一個。所以它有時會在循環過程中觸發NRE,最後一段代碼被刪除後(它並不總是刪除它們) 感謝您的幫助。 – xNidhogg

1

什麼,如果該函數返回兩種不同的結果(可能性不大,但不無論如何兩次調用這個可能昂貴的功能 - 保存結果的變量,檢查/使用這個變量)

如果.Codes部分爲空 - 檢查這個也是一樣!

0

是否有可能函數的返回值在兩個條件之間變化?

嘗試分配到一個局部變量,做你的支票(與調試器步)

private static void checkCodesInPlayerCenter(GameObject player) 
{ 
    Vector2 collisionCenter = player.GetCollisionCenter(player.PublicCollisionRectangle); 

    var squareAtPixel = TileMap.GetMapSquareAtPixel(collisionCenter); 

    if (squareAtPixel == null) 
    { 
     return; 
    } 

    for (int i = 0; i < squareAtPixel.Codes.Count; ++i) 

這也可能更好,如果GetMapSquareAtPixel呼叫貴(一個呼叫VS兩個電話時,你真的關心是一個空檢查)

編輯:當NRE被拋出時,它試圖得到哪個變量?

0

我強烈建議將TileMap.GetMapSquareAtPixel返回值賦值給某個局部變量,並在對照null條件進行檢查並在for循環中使用相同的變量。

這將工作。

0

如果您要調用的方法是變異狀態(通常一個getter 不應該做),那麼它可能不是冪等調用,這意味着多次調用並不安全。

此外,在調試器中添加該表達式很可能導致在進入代碼之前對其進行評估,從而導致NPE。

我會主張嘗試將TileMap.GetMapSquareAtPixel的值存儲在一個單獨的變量中。

相關問題