Использование неназначенной локальной переменной «словарь» - PullRequest
3 голосов
/ 18 июня 2010

Я получил ошибку Использование неназначенной локальной переменной «словарь», несмотря на то, что я присвоил значение в следующем коде:

private static void UpdateJadProperties(Uri jadUri, Uri jarUri, Uri notifierUri)
    {
        Dictionary<String, String> dictionary;

        try
        {
            String[] jadFileContent;

            // Create an instance of StreamReader to read from a file.
            // The using statement also closes the StreamReader.
            using (StreamReader sr = new StreamReader(jadUri.AbsolutePath.ToString()))
            {
                Char[] delimiters = { '\r', '\n' };
                jadFileContent = sr.ReadToEnd().Split(delimiters, System.StringSplitOptions.RemoveEmptyEntries);
            }

            // @@NOTE: Keys contain ": " suffix, values don't!
            dictionary = jadFileContent.ToDictionary(x => x.Substring(0, x.IndexOf(':') + 2), x => x.Substring(x.IndexOf(':') + 2));

        }
        catch (Exception e)
        {
            // Let the user know what went wrong.
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }

        try
        {
            if (dictionary.ContainsKey("MIDlet-Jar-URL: "))
            {
                // Change the value by Remove follow by Add

            }
        }
        catch (ArgumentNullException ane)
        {

            throw;
        }

    }

Ошибка с линии:

if (dictionary.ContainsKey("MIDlet-Jar-URL: "))

Может кто-нибудь помочь мне, пожалуйста? ТИА

Ответы [ 5 ]

5 голосов
/ 18 июня 2010

Вы должны быть явно здесь:

Dictionary<String, String> dictionary = null;

Существует возможность , которая не будет назначена, когда вы попытаетесь использовать ее в своем втором операторе try, например, если вы бросите исключение сразу в первой попытке, словарь не будет указать на что угодно. Это не предотвратит исключение ссылки null (вам придется с этим справиться), оно просто прояснит ваши намерения для компилятора.

1 голос
/ 18 июня 2010

Если перед следующей строкой выдается исключение:

dictionary = jadFileContent.ToDictionary(x => x.Substring(0, x.IndexOf(':') + 2), x => x.Substring(x.IndexOf(':') + 2));

dictionary не будет назначено.

Возможный путь к коду:

private static void UpdateJadProperties(Uri jadUri, Uri jarUri, Uri notifierUri)
    {
        Dictionary<String, String> dictionary;

        try
        {
            String[] jadFileContent;

            // Create an instance of StreamReader to read from a file.
            // The using statement also closes the StreamReader.
            using (StreamReader sr = new StreamReader(jadUri.AbsolutePath.ToString()))
            {
                Char[] delimiters = { '\r', '\n' };
                jadFileContent = sr.ReadToEnd().Split(delimiters, System.StringSplitOptions.RemoveEmptyEntries);
                throw new Exception();
            }

            // @@NOTE: Keys contain ": " suffix, values don't!
            //dictionary = jadFileContent.ToDictionary(x => x.Substring(0, x.IndexOf(':') + 2), x => x.Substring(x.IndexOf(':') + 2));

        }
        catch (Exception e)
        {
            // Let the user know what went wrong.
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }

        try
        {
            if (dictionary.ContainsKey("MIDlet-Jar-URL: "))
            {
                // Change the value by Remove follow by Add

            }
        }
        catch (ArgumentNullException ane)
        {

            throw;
        }

    }
1 голос
/ 18 июня 2010

Компилятор не знает, что вы ему присвоили.Он знает, что будет сгенерировано исключение, и присвоение никогда не произойдет.

Просто назначьте null словарю при его объявлении.

0 голосов
/ 18 июня 2010

Ваша проблема в том, что когда вы его определили: Dictionary<String, String> dictionary; вы не инициализировали его.Происходит то, что вы присваиваете значение в операторе try, которое, в зависимости от того, что еще происходит в этом операторе, может никогда не попасть в код присваивания переменной словаря.
Вы можете объединить два блока try catch,Таким образом, вам не нужно его инициализировать, потому что все они используются в одной и той же ветви кода.Переменная словаря не может быть использована до ее назначения.

try
    {
        Dictionary<string,string> dictionary;
        String[] jadFileContent;

        // Create an instance of StreamReader to read from a file.
        // The using statement also closes the StreamReader.
        using (StreamReader sr = new StreamReader
          (jadUri.AbsolutePath.ToString()))
        {
            Char[] delimiters = { '\r', '\n' };
            jadFileContent = sr.ReadToEnd().Split(delimiters,
                 System.StringSplitOptions.RemoveEmptyEntries);
        }

        // @@NOTE: Keys contain ": " suffix, values don't!
        dictionary = jadFileContent.ToDictionary
         (x => x.Substring(0, x.IndexOf(':') + 2), 
          x => x.Substring(x.IndexOf(':') + 2));


        if(dictionary == null)
        {
           throw new Exception("dictionary is null");
           //or ArgumentNullException since you specified 
           //in the second try catch block.
        }

        if (dictionary.ContainsKey("MIDlet-Jar-URL: "))
        {
            // Change the value by Remove follow by Add

        }

    }
    catch (ArgumentNullException ane)
    {

        throw;
    }
    catch (Exception e)
    {
        // Let the user know what went wrong.
        Console.WriteLine("The file could not be read:");
        Console.WriteLine(e.Message);
    }
0 голосов
/ 18 июня 2010

Ваш блок try..catch создает область. Ваш словарь инициализируется в первом блоке try, но он может никогда не достичь этого кода (например, если что-то вызывает исключение раньше). Таким образом, второй блок try может получить доступ к неинициализированному словарю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...