令人困惑的空引用异常

本文关键字:引用 异常 | 更新日期: 2024-10-31 01:37:14

我创建了两个组合框,一个用于最小值,一个用于最大值。我的代码应确保用户不会使用此代码选择大于最大值的最小值或小于最小值的最大值。

private void MaxRating_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            switch (MaxRating.SelectedIndex)
            {
                case 0:
                    if (MinRating.SelectedIndex > 0)
                        MinRating.SelectedIndex = 0;
                    break;
                case 1:
                    if (MinRating.SelectedIndex > 1)
                        MinRating.SelectedIndex = 1;
                    break;
                case 2:
                    if (MinRating.SelectedIndex > 2)
                        MinRating.SelectedIndex = 2;
                    break;
                case 3:
                    if (MinRating.SelectedIndex > 3)
                        MinRating.SelectedIndex = 3;
                    break;
                case 4:
                    if (MinRating.SelectedIndex > 4)
                        MinRating.SelectedIndex = 4;
                    break;
            }
        }

但是,当在显示"if (MinRating.SelectedIndex> 0)"的行进行调试时,我得到"NullReferenceException 未由用户代码处理"。

我不知道为什么,我还有一个MinRating_SelectionChanged功能,而且我似乎在那里没有得到类似的东西。

如果我删除大小写:0从这个函数来看,似乎没有错误。也不是来自其他功能。我也尝试用 == 替换>,但它似乎只是做同样的事情。任何帮助都会受到赞赏,因为我只是感到困惑。

编辑:如果我只是放置这两行

int minrating = MinRating.SelectedIndex;
int maxrating = MaxRating.SelectedIndex;

它在第二行给出错误

令人困惑的空引用异常

如果仔细分析,您会发现即使在控件初始化期间也可能调用此方法,其中刚刚构造了MaxRating,但甚至没有构造MinRating。不能假定在调用此方法时构造了它们。

作为解决方法,您可以在此方法开始时检查两者的 null。

你不能这么说吗?

if (MinRating.SelectedIndex > MaxRating.SelectedIndex)
{
    MinRating.SelectedIndex = MaxRating.SelectedIndex;
}

然后,您不会尝试读取尚未设置的值。而且它要短得多。

在侧节点上:不应使用 SelectedIndex 属性。使用对象的值,而不是使用它们在集合中的位置。

我对 C# 没有经验,但也许当 MaxRating.SelectedIndex 为空时执行情况 0,(0 相当于空),因此它以空 MaxRating.SelectedIndex 进入案例。