C# 字典包含键,但崩溃时说它没有';T
嘿,我有下面这样的代码C# 字典包含键,但崩溃时说它没有';T,c#,dictionary,C#,Dictionary,嘿,我有下面这样的代码 public object RetrieveItemRun(int item) { if (dictionary.ContainsKey(item)) { MessageBox.Show("Retrieving" + item.ToString()); } return dictionary[item]; } 当尝试获取0的键时,它总是崩溃,消息框确实显示,因此ContainsKey方法为true,但当我尝试从键检索值时,
public object RetrieveItemRun(int item)
{
if (dictionary.ContainsKey(item))
{
MessageBox.Show("Retrieving" + item.ToString());
}
return dictionary[item];
}
当尝试获取0的键时,它总是崩溃,消息框确实显示,因此ContainsKey方法为true,但当我尝试从键检索值时,它崩溃,并说:
“字典中不存在给定的密钥”您正在尝试检索独立于的密钥(如果存在)。尝试将代码更改为:
public object RetrieveItemRun(int item)
{
if (dictionary.ContainsKey(item))
{
MessageBox.Show("Retrieving" + item.ToString());
return dictionary[item];
}
return null;
}
如果存在,则返回该项目。假设项目退出(外部检查),则返回原始代码。您也可以使用
TryGetValue
方法来避免异常:
public object RetrieveItemRun(int item)
{
object result;
if (dictionary.TryGetValue(item, out result))
{
MessageBox.Show("Retrieving" + item);
}
return result;
}
一个简单的“else”就可以帮你完成这项工作。如果键为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;
}
此方法是否由多个线程调用?老实说,我只是不相信你给我们看的代码。向我们演示您是如何调用
RetrieveItemRun()
,但该检查不安全,另一个线程删除项将解释这一点。此外,无论是否包含返回true
,您都在查找项
,这是另一个故障点。您确定没有两次调用该函数吗?而且,这个返回应该被放入if-maybly中。我猜您多次调用这个方法,比如说对于0
和之后的1
。0
调用成功,但1
导致错误。这可以解释你所看到的。是否可能插入了空值?在这种情况下,内部NullPointerException可能会被包装为NotFoundException。@Aubin键是int
,因此它不能是null
。我知道我应该在if中返回,但我的程序的工作方式不可能有键,即使我单步执行程序,它也清楚地包含键0和一个值,然后在返回行崩溃,当项目也清楚地为0时。我的程序不使用线程,而是按顺序运行。但它只在0时执行,当我将项添加到字典时,我使用dictionary.count作为键,因此每个现在添加的值都将有键0、1、2、3,Etcy您还应该在答案的代码中添加一个锁
,以确保线程安全。@Kosmo如何声明字典?@Guillaume锁只有在从其他线程写入字典时才是必需的。仅读取时不需要锁定(但根据OP,它似乎是单线程)。此外,为了提高速度,请使用字典。TryGetValue(key,out ref item)
,这是一个单一的查找操作。使用ContainsKey
然后通过索引器访问值意味着两个查找操作。这是更好的解决方案,使用TryGetValue
更快更优雅。ContainsKey
不会引发异常,除非它被指定为null
。所以你的第一条路行不通。