2012-10-16 23 views
2

嘿,我有以下这样的代码字典有钥匙,但崩溃说它不

public object RetrieveItemRun(int item) 
{ 
    if (dictionary.ContainsKey(item)) 
    { 
     MessageBox.Show("Retrieving" + item.ToString()); 
    } 
    return dictionary[item]; 
} 

它试图获得的0键时总是死机,消息框确实表明所以ContainsKey方法是真实的,但是当我尝试检索从键的值崩溃说:

“给定的键不存在在词典中”

+4

这是方法,通过多线程叫什么名字?老实说,我只是不会用你向我们显示的代码购买它。向我们展示如何调用'RetrieveItemRun()',但该检查不是线程安全的,另一个线程删除项目将解释它。此外,无论“Contains”是否返回“true”,您都在查找“item”,这是另一个失败点。 –

+3

你确定没有两个调用函数?此外,应该把这个回报放在如果可能。 – phant0m

+3

我的猜测是,你调用此方法多次,说两个'0'和为'1'之后。 '0'调用成功,但'1'导致错误。这将解释你所看到的。 – Enigmativity

回答

13

您正试图取回钥匙独立的,如果它存在。尝试将代码更改为:

public object RetrieveItemRun(int item) 
    { 
     if (dictionary.ContainsKey(item)) 
     { 
      MessageBox.Show("Retrieving" + item.ToString()); 
      return dictionary[item]; 
     } 
     return null; 
    } 

如果存在,则返回该项目。你原来的代码返回假设项目退出(外检查)

+0

我明白我应该在如果返回,但这样我的程序运行它不可能为它有钥匙,甚至当我按步骤执行程序它显然包含的值的键0然后崩溃在返回线时项目显然也是0。我的程序不使用所有顺序的线程。它只用0来实现,但是当我将词条添加到词典中时,我使用dictionary.count作为键,因此每个现在增加的值都会有键,0,1,2,3等。 – ThingWings

+0

您还应该添加一个'lock'为您的答案代码中的线程安全。 – Guillaume

+0

@Kosmo你如何声明字典? – K3N

4

您还可以使用TryGetValue方法来避免异常:

public object RetrieveItemRun(int item) 
    { 
     object result; 
     if (dictionary.TryGetValue(item, out result)) 
     { 
      MessageBox.Show("Retrieving" + item); 
     } 

     return result; 
    } 
+1

这是更好的解决方案,使用'TryGetValue'更快,更优雅。 –

1

一个简单的“别人”会做你的工作。如果密钥为null,则ContainsKey()方法会引发此异常!你最好也处理它。

 try 
     { 
      if(dictionary.ContainsKey(item)) 
      { 
       MessageBox.Show("Retrieving" + item.ToString()); 
      }    
      else 
      { 
       MessageBox.Show("Value not found!"); 
       return null; 
      } 
     } 
     catch(KeyNotFoundException) 
     { 
      MessageBox.Show("Null key!"); 
      return null; 
     } 
+0

'ContainsKey'不会抛出异常,除非给出'null'。所以你的第一种方式是行不通的。 – Arran

+0

编辑它!感谢您指出Arran。 – CRoshanLG

相关问题