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

时间:2014-10-11 02:31:31

标签: c# nullreferenceexception

我有一个四叉树,它有一个删除方法,每次我从游戏中删除一个项目,我称之为这个方法。问题是在foreach循环中,子变量为null。如何绕过这个方法,所以如果变量为null,它不会给我一个错误?

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中的子项,因为如果我循环执行,那么我会在子变量处得到错误。这意味着节点没有孩子。

2 个答案:

答案 0 :(得分:1)

您已经在检查每个child是否为null

如果node.Children存在null的风险,请在访问之前检查一下:

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

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

答案 1 :(得分: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;
}