繁体   English   中英

java:如何声明final在try-catch块中初始化的变量?

[英]java: how to declare final a variable that is initialized inside a try - catch block?

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

问题是变量必须在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,则会在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的堆栈溢出的两个问题

什么时候应该使用final作为方法参数和局部变量?

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

您可以更准确地处理异常。 如果你得到一个异常打开连接,你不必在finally块中关闭它我猜。 如果在此之后遇到异常,则在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);
    }

这个怎么样?

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

为什么你想要它最终? 如果要将其传递给匿名内部类,则可以执行以下操作:

Connection conn = null;
try {
    conn = getConn(prefix);
    final Connection finalConn = conn;
    // pass it to inner class here
} catch (Exception e) {
    throw new DbHelperException("error opening connection", e);
} finally {
    closeConnection(conn);
}

使用此解决方案的唯一问题(也是相当大的问题)是,一旦离开此块,就会关闭连接。 因此,除非您立即声明并呼叫您的匿名内部课程,否则这种模式不会起作用。

无论哪种方式,如果我是你,我可能会改写整个事情,将prefix改为最终,并将连接处理委托给anon内部类。

你能尝试在catch和finally块中分配它吗? 像这样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM