【问题标题】:Confusing NullReferenceException令人困惑的 NullReferenceException
【发布时间】:2012-08-08 01:55:45
【问题描述】:

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

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 的​​函数,但我似乎没有得到类似的东西。

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

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

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

它在第二行给出错误

【问题讨论】:

  • 您能否将整个异常文本放入问题中
  • 解决这个问题后,您还可以将代码简化为 1 行:MinRating.SelectedIndex = Math.Min(MinRating.SelectedIndex, MaxRating.SelectedIndex);
  • 在抛出异常的行添加断点,并检查表达式的每个部分是否有空引用
  • 关于编辑:这意味着没有为 MaxRating 选择索引。您正在询问尚未(尚未)进行的选择的结果。

标签: c# .net wpf nullreferenceexception


【解决方案1】:

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

您可以在此方法的开头检查它们是否为 null 作为一种解决方法。

【讨论】:

  • 好点。在创建两个控件之后手动注册 SelectionChanged 事件,或者确保在创建两个控件之前不填充控件。在后一种情况下,您还必须考虑到所有元素都必须在控件“中”,然后再选择其中一个。
  • 是的,这似乎是问题所在!通过在 MinRating 和 MaxRating 上放置一个加载的事件并创建两个布尔值 MinRatingControlLoaded 和 MaxRatingControlLoaded 并在尝试执行代码之前添加一个 if 语句使这两个布尔值为真来修复它,谢谢!
【解决方案2】:

你就不能这么说吗?

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

那么您就不要尝试读取尚未设置的值。它也短了很多。

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

【讨论】:

  • 那..会更容易是的..更清晰..在各方面都更好..但我仍然有错误
  • 只有在您确实在 MaxRating 中选择了一个项目时才有效。
  • 嗯,选择了默认项目,所以这不是问题
【解决方案3】:

我对 C# 没有那么丰富的经验,但是当 MaxRating.SelectedIndex 为 null 时,可能会执行 case 0(0 相当于 null),因此它会进入带有 null MaxRating.SelectedIndex 的 case。

【讨论】:

  • SelectedIndex 是int ValueType(不可为空的值)
猜你喜欢
  • 2022-01-21
  • 2022-01-17
  • 2018-02-26
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
相关资源
最近更新 更多