почему я не могу назначить переменные объекта в блоке try? - PullRequest
2 голосов
/ 11 августа 2010

Почему я не могу назначить переменные объекта в блоке try?

Если я попытаюсь сделать это и очистить переменную в блоке finally, я получу ошибку компилятора: «использование неназначенной локальной переменной» . Это не имеет смысла, поскольку переменная объявляется перед блоком try, а в блоке finally я сначала проверяю, является ли переменная null.

Почему следующий код не может быть скомпилирован? Я проверяю, является ли dbc null, поэтому нет никаких шансов, что он попытается что-то сделать с неназначенной переменной.

например:

DbConnection dbc;
try {
    dbc = <some method call returning an open DbConnection>
    // do stuff
} catch (Exception e) { // do stuff }
finally { 
    if (dbc != null) {
        dbc.Close();
    }
}

Ответы [ 2 ]

12 голосов
/ 11 августа 2010

Измените ваше объявление на DbConnection dbc = null;, чтобы компилятор мог точно знать, что переменная назначена.(Просто объявление dbc - это не то же самое, что присвоение ему значения null, вы должны явно указывать локальное.)

Причина, по которой ваш существующий код дает сбой, состоит в том, чтовозможно возникновение исключения до установки dbc.Таким образом, компилятор не может предполагать, что dbc назначен ко времени выполнения блока finally.

Для получения дополнительной информации см. Раздел 5.3 спецификации языка для определенного назначения.

http://msdn.microsoft.com/en-us/library/aa691172(VS.71).aspx

1 голос
/ 11 августа 2010

Измените

DbConnection dbc;

на

DbConnection dbc = null;
...