Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字典包含键,但崩溃时说它没有';T_C#_Dictionary - Fatal编程技术网

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
。所以你的第一条路行不通。