如何修正'值不能为空。参数名称:C#中的“键”错误

时间:2019-01-10 21:46:27

标签: c#

我在C#中使用字典,想要显示用户输入的键,并显示该键及其相应值(如果该键存在于字典中)。另外,继续阅读各行,直到没有更多输入为止。

using System;
using System.Collections.Generic;
using System.IO;

class Solution 
{
    static void Main(String[] args) 
    {
        string number = Console.ReadLine();
        int n;
        Int32.TryParse(number, out n);

        var phoneBook = new Dictionary<string, string>();

        for(int i = 0; i < n; i++)
        {
            string name = Console.ReadLine();
            string phoneNumber = Console.ReadLine();
            phoneBook.Add(name, phoneNumber);
        }

        foreach (var pair in phoneBook)
        {
            string name = pair.Key;
            string phoneNumber = pair.Value;
        }


        string x = Console.ReadLine();
        if(!phoneBook.ContainsKey(x))
        {
            Console.WriteLine("Not Found");
        }
        else
        {
            string result = phoneBook[x];
            Console.Write(x);
            Console.Write("=");
            Console.Write(result);
        }
    }
}


Error message:

    Unhandled Exception:
    System.ArgumentNullException: Value cannot be null.
    Parameter name: key
      at System.Collections.Generic.Dictionary2[TKey,TValue].FindEntry (TKey key) <0x7fb28d7c9320 + 0x0023c> in <3833a6edf2074b959d3dab898627f0ac>:0 
      at System.Collections.Generic.Dictionary2[TKey,TValue].ContainsKey (TKey key) <0x7fb28d7c8cd0 + 0x00009> in <3833a6edf2074b959d3dab898627f0ac>:0 
      at Solution.Main (System.String[] args) [0x00096] in solution.cs:30 
    [ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentNullException: Value cannot be null.
    Parameter name: key
      at System.Collections.Generic.Dictionary2[TKey,TValue].FindEntry (TKey key) <0x7fb28d7c9320 + 0x0023c> in <3833a6edf2074b959d3dab898627f0ac>:0 
      at System.Collections.Generic.Dictionary2[TKey,TValue].ContainsKey (TKey key) <0x7fb28d7c8cd0 + 0x00009> in <3833a6edf2074b959d3dab898627f0ac>:0 
      at Solution.Main (System.String[] args) [0x00096] in solution.cs:30

3 个答案:

答案 0 :(得分:3)

更改行:

if(!phoneBook.ContainsKey(x))

收件人:

if(x == null || !phoneBook.ContainsKey(x))

我相信错误指向该行代码。请添加指向错误代码行的注释(以使我们更容易),并请将异常文本重新设置为代码格式(删除了反引号),以便使堆栈可读。

答案 1 :(得分:2)

简短的答案是您的对象之一是null。很有可能其中一个变量是通过调用Console.ReadLine来设置的。

通常认为Console.ReadLine无法返回null。这是错误的。如果在控制台上输入了null,它将返回Control-Z

因此,您需要先检查null,然后才能与Dictionary进行交互(例如,调用AddContainsKey)。或者,从以下位置更改您的ReadLine呼叫:

string x = Console.ReadLine();

收件人:

string x = Console.ReadLine() ?? string.Empty;

确保变量不能null

为求最佳,请考虑使用TryGetValueContainsKey来避免以后的[]通话。

答案 2 :(得分:0)

using System;
using System.Collections.Generic;
using System.IO;
class Solution 
{
    static void Main(String[] args) 
    {   
        var phoneBook = new Dictionary<string, string>();

        int n = Convert.ToInt32(Console.ReadLine());

        for(int i = 0; i < n; i++)
        {
            string[] record = Console.ReadLine().Split();
            string name = record[0];
            string phoneNumber = record[1];
            phoneBook.Add(name, phoneNumber); 
        }

        string x;
        while((x = Console.ReadLine()) != null)
        {
            if(phoneBook.ContainsKey(x))
            {
                Console.WriteLine(x + "=" + phoneBook[x]);
            }
            else
            {
                Console.WriteLine("Not found");
            }
        }
    }
}

这是对我有用的最终解决方案。 变化: 1.添加了while循环条件,以避免搜索字符串为空。 2.删除了不需要的foreach循环。 3.在for循环中,使用字典输入来使用数组在字典的每个记录/条目中存储两个字符串。