将项添加到字典会导致NullReferenceException

时间:2011-03-28 15:48:05

标签: c# asp.net dictionary nullreferenceexception

以下代码在过去几个月中只抛出了几次NullReferenceException,但我不确定为什么。代码不是我的,但它对我来说非常直接。

Type pageType = page.GetType();

if (_pages.TryGetValue(pageType, out value))
    return value;

// The following line throws the exception
return _pages[pageType] = new MyPage(_section.Pages[page]);
  

[NullReferenceException:Object   引用未设置为的实例   宾语。]   System.Collections.Generic.Dictionary 2.Insert(TKey key, TValue value, Boolean add) +210 System.Collections.Generic.Dictionary 2.set_Item(TKEY的   关键,TValue值)+11

我唯一能想到的是pageType在被用作字典键时为空,但显然是that is not possible

调用它的代码很简单:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    _mypage = GetPage();
}

我还认为错误可能在_section.Pages,但是section永远不会为null,并且永远不会设置任何内容。如果.Pages[page]返回null,则MyPage构造函数只返回。那我错过了什么?

6 个答案:

答案 0 :(得分:2)

我遇到了这个问题,结果证明是线程相关的。

通过在插入字典的行周围放置同步锁,可以防止错误:

必须将其添加为类级别定义:

private static object _sync = new object();

这是由同步锁包围的插入语句:

lock (_sync)
{
    return _pages[pageType] = new MyPage(_section.Pages[page]);
}

这是为我解决的帖子:Throw a NullReferenceException while calling the set_item method of a Dictionary object in a multi-threading scenario

答案 1 :(得分:1)

我认为它会抛出一个异常,因为字典中没有关键 pageType 的元素,并且访问者返回null。

尝试

MyPage newPage = new MyPage(_section.Pages[page]);
_pages.Add(pageType, newPage);
return newPage;

或者如果您尝试重复使用该条目:

MyPage newPage = new MyPage(_section.Pages[page]);
if (_pages.ContainsKey(pageType))
   _pages[pageType] = newPage;
else
   _pages.Add(pageType, newPage);

答案 2 :(得分:1)

也许字典用户在其他地方定义了在某些情况下失败的自定义 IEqualityComparer 。检查代码创建字典的位置,以查看是否传递了自定义比较器。也许比较器也可以为null,但这意味着这段代码永远不会运行......

答案 3 :(得分:0)

为了清楚起见,我会将它们分开,然后看看发生了什么。

var section = _section.Pages[page];
var newPage = new MyPage(section);
_pages.Add(pageType,newPage);
return newPage;

答案 4 :(得分:0)

我认为_pages或pageType对象为null。另一个机会是_section object。

答案 5 :(得分:0)

由于TryGetValue没有失败,它看起来是由_section.Pages [page]引起的。由于异常来自Dictionary.Insert方法,很可能是由页面的相等/哈希代码实现引起的。是否有针对页面类型的IEqualityComparer或Equals / GetHashCode方法的自定义实现?如何创建这些词典?