确定设置后,获取对象引用未设置错误

时间:2015-05-15 09:52:55

标签: c#

我得到一个'对象引用没有设置为对象的实例'错误,我无法解释为什么我在全局声明和创建对象。

当我尝试将第一个项目添加到字典时触发异常。继承我的代码:

//declared at the top of my page globally
Dictionary <String, MyCustomType> MyDictionary = new Dictionary();
MyCustomType myCustomType = new MyCustomType();

//Then later in a (private void) method:
//First part of if statement checks if we already have anything in there 
//and if the key already exists. If so, it overwrites it

if (MyDictionary != null && MyDictionary.ContainsKey(some_string)
{
    //  replace the item in the dictionary
}
// if the dictionary is null or the key isnt already in the dictionary.  
// This is where it is throwing the exception
else 
{
    MyDictionary.add(some_string, myCustomType)
}

调试时,它确实说MyDictionary是null,但这是预期的,因为我还没有任何东西,并且else语句中的add的行为放在那里,所以我真的不确定为什么它在这里抛出一个例外。调试还显示some_string和myCustomType具有我期望它们具有的值。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

保持简单:

if (MyDictionary == null) MyDictionary = new Dictionary<string, CustomType>();
MyDictionary[some_string] = myCustomType;

答案 1 :(得分:2)

即使您确定没有空引用,也必须有一个;否则你不会得到NullReferenceException。运行时通常是正确的。

  • 您是否确保初始化myDictionary的代码在中运行
  • 您是否确保myDictionary的初始化始终在使用它的私有方法之前运行

现在开始做其他事情:

myDictionary[key] = value;

将在两种情况下都有效,即当字典还没有key的条目时,以及当key已有条目时。

使用[]优于当前的两步流程(首先使用ContainsKey检查,然后Add或更新)更加原子化;在这两个步骤之间,另一个线程干扰您的字典的风险较小。 (虽然,事实是,如果这是一个问题,你可能最好使用ConcurrentDictionary。)

答案 2 :(得分:1)

在调用MyDictionary

之前,您需要测试MyDictionary.add(...是否为null并实例化它。

该行:

Dictionary <String, MyCustomType> MyDictionary = new Dictionary();

不会编译,所以我不确定你的代码中有什么。

您需要将代码更改为:

if (MyDictionary != null && MyDictionary.ContainsKey(some_string)
{
    ...
}
else
{
    if (MyDictionary == null)
    {
        MyDictionary = new Dictionary<String, MyCustomType>(); 
    }
    MyDictionary.Add(some_string, myCustomType);
}

答案 3 :(得分:0)

我认为你应该像这样重拍你的

if (MyDictionary != null)
{
    if(MyDictionary.ContainsKey(some_string)
    {
        //  replace the item in the dictionary
    }
     // if the dictionary is null or the key isnt already in the dictionary.      This is where it is throwing the exception
    else 
    {
        MyDictionary.add(some_string, myCustomType)
    }
}