java:如何最终声明一个在 try - catch 块中初始化的变量?

2022-09-03 07:58:39

我有一个变量,在初始化后不应该改变它的值,所以我想把它定义为一个最终的变量。

问题是变量必须在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);
}

如果我将 variabale 声明为 final,而不将其初始化为 null,则会在 finally 块上得到一个“局部变量 conn 可能尚未初始化”。另一方面,如果我将其声明为 final 并将其初始化为 null,则会在 try 块中收到错误“无法分配最终的局部变量 conn”。

编辑:在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 用于方法参数和局部变量?

在 Java 中适用时使用“final”修饰符


答案 1

您可以更准确地处理异常。如果你得到一个异常打开连接,你不必在最后的块中关闭它。如果在此之后收到异常,请在 try 块中处理该异常,并在新的嵌套 try-catch 块中处理该异常,则无需在外部定义变量。像这样:

    try {
        final Connection conn = getConn(prefix);
        try {
            //code using conn
        } catch (Exception e) {

        } finally {
            closeConnection(conn);
        }
    } catch (DbHelperException e) {
        throw new DbHelperException("error opening connection", e);
    }

答案 2

怎么样?

Connection temp = null;
try {
    temp = getConn(prefix);
} catch (Exception e) {
    throw new DbHelperException("error opening connection", e);
} finally {
    closeConnection(conn);
}
final Connection conn = temp;

推荐