在foreach循环中避免变量的空引用异常,可能为空

问题描述:

我有一个具有删除方法的四叉树,并且每次从游戏中删除一个项目时,我都会调用此方法。问题是在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

您已在检查每个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

你必须检查是否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; 
}