java: как объявить final переменную, которая инициализируется внутри блока try - catch?

У меня есть переменная, которая не должна менять свое значение после инициализации, поэтому я хочу определить ее как конечную переменную.

проблема в том, что переменная должна быть инициализирована внутри блока try, поэтому я получаю следующие проблемы:

У меня есть следующий код:

Connection conn = null;
try {
    conn = getConn(prefix);
    [...do some stuff with conn...]
} catch (Exception e) {
    throw new DbHelperException("error opening connection", e);
} finally {
    closeConnection(conn);
}

Если я объявляю переменную как final, не инициализируя ее в null, я получаю ошибку 'The local variable conn may have not been initialized' в блоке finally. С другой стороны, если я объявляю ее final и инициализирую в null, я получаю ошибку 'The final local variable conn cannot be assigned' в блоке try.

EDIT: после ответа lxx я пришел к такой версии

try {
    final Connection conn = conn = getConn(prefix);
    try {
        return selectAll(conn, sql, params);
    } catch (Exception e) {
        throw new DbHelperException("error executing query", e);
    } finally {
        closeConnection(conn);  
    }
} catch (Exception e) {
    throw new DbHelperException("error opening connection", e);
}

Значит, так и должно быть?

--

Урок усвоен:

Я думаю, что правильный ответ на вопрос - тот, который дал lxx, но в данном случае я полагаю, что минусы объявления переменной final перевешивают ее плюсы...

--

EDIT: нашел два вопроса на stack overflow о том, когда использовать final

Когда следует использовать final для параметров метода и локальных переменных?

Использование модификатора "final", когда это применимо в java

15
задан Community 23 May 2017 в 12:33
поделиться