A KeyNotFoundException was thrown. This is likely caused by an invalid usage of the Dictionary collection. As always we want a quick way to fix the problem.
The KeyNotFoundException here is thrown on the final line of try-block. The string "test" doesn't exist in the collection.
Program that throws KeyNotFoundException [C#]
Fix
Here we look at how you can fix this exception by using the TryGetValue method on the Dictionary constructed type. Note that could use ContainsKey instead of TryGetValue, but the below code preserves the intention of the previous code.
Program that does not throw [C#]
Not found
You always have to use the if statement when testing values in the Dictionary, because there is always a possibility that the key won't exist.
We saw how to raise and catch the KeyNotFoundException during runtime. We then saw how to avoid causing the exception. We discussed alternatives, such as TryGetValue and ContainsKey, and looked at a program that does not have this problem.
Example
First, here we see some code that looks correct, but actually has a severe flaw. The problem is that you cannot look up a key that doesn't exist in the Dictionary and try to assign your variable to its value.The KeyNotFoundException here is thrown on the final line of try-block. The string "test" doesn't exist in the collection.
Program that throws KeyNotFoundException [C#]
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
try
{
//
// Create new Dictionary with string key of "one"
//
Dictionary<string, string> test = new Dictionary<string, string>();
test.Add("one", "value");
//
// Try to access key of "two"
//
string value = test["two"];
}
catch (Exception ex)
{
//
// An exception will be thrown.
//
Console.WriteLine(ex);
}
}
}
Output
System.Collections.Generic.KeyNotFoundException:
The given key was not present in the dictionary.
at System.ThrowHelper.ThrowKeyNotFoundException()
Fix
Here we look at how you can fix this exception by using the TryGetValue method on the Dictionary constructed type. Note that could use ContainsKey instead of TryGetValue, but the below code preserves the intention of the previous code.
Program that does not throw [C#]
using System;Output
using System.Collections.Generic;
class Program
{
static void Main()
{
Dictionary<string, string> test = new Dictionary<string, string>();
test.Add("one", "value");
//
// Use TryGetValue to avoid KeyNotFoundException.
//
string value;
if (test.TryGetValue("two", out value))
{
Console.WriteLine("Found");
}
else
{
Console.WriteLine("Not found");
}
}
}
Not found
You always have to use the if statement when testing values in the Dictionary, because there is always a possibility that the key won't exist.
We saw how to raise and catch the KeyNotFoundException during runtime. We then saw how to avoid causing the exception. We discussed alternatives, such as TryGetValue and ContainsKey, and looked at a program that does not have this problem.
No comments:
Post a Comment