gpt4 book ai didi

java - Java 1.6 中的 Try-with-resources 等价物

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:13 25 4
gpt4 key购买 nike

我有以下代码:

    public class Main {

public static void main(String[] args) throws SQLException {

try (
Connection conn = DBUtil.getConnection(DBType.HSQLDB);
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT * FROM tours");
) {

DBUtil.getConnection();

} catch (SQLException e) {
DBUtil.processException(e);
}

}

}

我使用这段代码从数据库中获取数据。我的问题是不允许我使用 Java 1.7 编译器而必须使用 1.6。我如何翻译 try-with-resources-code 以与 1.6 编译器一起使用?在这个特殊的 try block 中到底发生了什么?

最佳答案

Oracle 解释了 try-with-resources 的工作原理 here

它的 TL;DR 是:
在 Java 1.6 中没有简单的方法可以做到这一点。问题是 Exception 中没有 Suppressed 字段。您可以忽略它并硬编码当尝试和关闭都抛出不同异常时发生的事情,或者创建您自己的具有抑制字段的异常子层次结构。

在第二种情况下,上面的链接给出了正确的做法:

   AutoClose autoClose = new AutoClose();
MyException myException = null;
try {
autoClose.work();
} catch (MyException e) {
myException = e;
throw e;
} finally {
if (myException != null) {
try {
autoClose.close();
} catch (Throwable t) {
myException.addSuppressed(t);
}
} else {
autoClose.close();
}
}

相当于

try (AutoClose autoClose = new AutoClose()) {
autoClose.work();
}

如果你想让它更简单而不是创建一大堆新的 Exception 类,你将不得不决定在 finally(t 或 e)内的 catch 子句中抛出什么。

附言。在上面的链接中也讨论了在 try 中处理多个变量声明。而要正确 执行此操作所需的代码量是惊人的。大多数人在 Java 1.6 中走捷径,不处理 finally block 中的异常并使用 nullchecks。

关于java - Java 1.6 中的 Try-with-resources 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23611940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com