2014-10-11 30 views
0

我有一個具有刪除方法的四叉樹,並且每次從遊戲中刪除一個項目時,我都會調用此方法。問題是在foreach循環中,該子變量爲空。我怎樣才能繞過這個方法,所以如果變量爲空它不會給我一個錯誤?在foreach循環中避免變量的空引用異常,可能爲空

private void CollapseChildren(RectangleTreeNode node) 
    { 
     foreach (RectangleTreeNode child in node.Children) 
     { 
      if (child == null) 
      { 
       return; 
      } 

      while (child.Items.Count > 0) 
      { 
       MoveUp(child.Items[0]); 
      } 
     } 

     node.Children = null; 
    } 

這裏是刪除方法。

private void Remove(RectangleTreeNode node, RectangleTreeItem item) 
    { 
     node.Items.Remove(item); 
     item.Parent = null; 

     while (node != null) 
     { 
      node.ItemCount--; 
      if (node.ItemCount < 6) 
      { 
       CollapseChildren(node); 
      } 
      node = node.Parent; 
     } 
    } 

如果該值爲null,則我不應該來遍歷nodes.Children孩子,因爲如果我通過然後做環我處子變量得到的錯誤。意思是節點沒有孩子。

+0

您的'return;'語句應該注意避免錯誤,儘管完全退出該方法可能並不完全符合您的要求。你可以詳細說明當值爲'null'時你想在該方法中發生什麼? – 2014-10-11 02:35:43

+0

如果該值爲空,那麼我不應該在nodes.Children中循環遍歷子元素,因爲如果我循環完成,那麼我會在子變量中得到錯誤。含義節點沒有子節點 – 2014-10-11 02:37:59

+1

我們的公司策略決不會像'node.Children = null'那樣設置集合null,總是創建一個像'node.Children = new RectangleTreeNode [0]'這樣的空集合。這避免了錯誤並且相當簡化了邏輯 – 2014-10-11 03:14:18

回答

1

您已在檢查每個child是否爲null

如果有的node.Childrennull風險,然後檢查太,對其進行訪問之前:

private void CollapseChildren(RectangleTreeNode node) 
{ 
    if (node.Children == null) 
     return; 

    foreach (RectangleTreeNode child in node.Children) 
    { 
     ... 
     ... 
    } 
} 
+0

仍然有錯誤。所以它不能在方法中。 – 2014-10-11 02:43:22

+0

堆棧跟蹤應該確切地告訴您哪個行正在拋出異常。你能告訴別的嗎? – 2014-10-11 02:44:19

+0

我試了下面的答案,它的工作!我只是讓他們錯誤的順序 – 2014-10-11 02:45:07

1

你必須檢查是否node.Children是調用foreach循環之前空,所以你的方法變成:

private void CollapseChildren(RectangleTreeNode node) 
{ 
    if (node.Children == null) 
    { 
     // exit the method, or do whatever is appropriate when node.Children is null 
     return; 
    } 

    foreach (RectangleTreeNode child in node.Children) 
    { 
     if (child == null) 
     { 
      return; 
     } 

     while (child.Items.Count > 0) 
     { 
      MoveUp(child.Items[0]); 
     } 
    } 

    node.Children = null; 
}