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

本文关键字:null 变量 异常 引用 循环 foreach 避免 | 更新日期: 2023-09-27 18:26:15

我有一个四叉树,它有一个remove方法,每次我从游戏中移除一个项目时,我都会调用这个方法。问题是在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中的子级,因为如果我循环遍历,那么我会在子变量处得到错误。意味着节点没有子节点。

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

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

如果node.Childrennull的风险,那么在访问之前也要检查一下:

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

在调用foreach循环之前,您必须检查node.Children是否为null,因此您的方法变为:

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;
}