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

标签 java try-catch try-with-resources

我有以下代码:

    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/

相关文章:

java - 如果在打开新流之间处理 IO 流,使用单个 try-finally block 还是嵌套 try-with-resources 更好?

java - maven 中的 neo4j EmbeddedNeo4j.java try-with-resources 错误

java - 我如何使用数组来制作随机圆圈

java - 以编程方式解锁屏幕并显示 Activity

java - 如何实现猜谜游戏的自定义异常

r - 使用 `tryCatch`并在表达式失败时打印错误消息

Java 使用带有 try-with-resources 的扫描器

java - JDBI 查询返回 MSSQL datetimeoffset(4) 列的错误值?

java - 在 JAVA 中替代 PHP 的关联数组

c# - 异常处理 C#