从列表中删除项目时出现NullReferenceException

时间:2015-09-23 06:41:24

标签: c# nullreferenceexception clear

以下代码在_items.Clear()步骤中给出了一个Null Reference Exception,我无法解决原因。

public void PlotDate()
    {
        if (_data == null) return;
        _items.Clear();
        _items.Add(new Graph
        {
            Name = "by date",
            Items = _data.GroupBy(e => string.Format("{0:yyyy-MMM}", e.Date))
            .Select(g => new Item { Key = g.Key, Value = g.Sum(x => x.Size) })
            .OrderByDescending(e => e.Value)
            .ToList()
        });
    }

_items是一个可绑定的图形集合,显示在xaml前端中。在这个例子中,图表只显示了一系列日期中所有尺寸总和的饼图。在课堂上,有一些方法可以显示几乎相同的不同数据,它们基本上只是对数据进行不同的分组。

奇怪的是,第一个总是加载得很好,无论我选择哪个,但是当我尝试打开第二个时,它会抛出异常。首次打开视图时,它还会运行一个填充_data并运行_items.Clear的方法,因此当_items为空时它可以正常工作。

我在任何想到的地方都设置了断点,试着看看发生了什么,但没有任何东西被设置为空。在_items.Clear步骤运行之前,_items的计数为1,然后在计数降至0之后立即抛出异常。

我还尝试使用_items.RemoveAt(0),并在添加新图表之后添加它并执行相同的操作。

发生了什么?

编辑:我将包含可能有用的此部分。 UI上的显示绑定到Items,由此确定,因此它可能是问题所在。我无法深入了解,看看NotifyOfPropertyChange的定义并没有产生任何有用的信息。

partial void OnItemsChanged();
        public BindableCollection<Graph> Items
        {
            get { return _items; }
            set 
            {
                if (value == _items) 
                    return;
                _items = value;
                OnItemsChanged();
                NotifyOfPropertyChange("Items");
            }
        }

3 个答案:

答案 0 :(得分:0)

如果没有剩下的代码,很难知道出了什么问题。调用Clear函数时,异常可能发生在其他地方。为了帮助您进行调试,您可以将VS配置为通过

抛出NullReferenceException
  

调试菜单 - &gt;例外.. - &gt;公共语言运行时异常    - &GT;系统 - &GT; System.NullReferenceException - &gt;检查投掷

VS将停在引发异常的代码行。

答案 1 :(得分:0)

也许_items为空。 只需在_items.Clear()行添加断点并调试应用程序。

答案 2 :(得分:0)

从堆栈跟踪中我可以看到在Clear()调用触发的OnCollectionChanged事件中抛出了异常。所以你应该检查一下这个事件会发生什么,并且应该在

之前显示
  

System.Collections.ObjectModel.ObservableCollection1.OnCollectionChanged(通知CollectionChangedEventArgs   E)

堆栈跟踪线。