当前位置: 首页 > 知识库问答 >
问题:

如何用两个资源重写try-with-resources,只使用try-catch-finally构造?

段晨
2023-03-14

如何重写下面的代码

try (A a = new A(); B b = new B()) {
//useful work here
}
catch (Exception e) {
//other code
}

使用try-catch-finally构造?

如果我们只创建一个资源,这里有一个很好的链接。

不幸的是,当我们创建多个资源时,我不明白如何概括这一点。

我不明白的一件事是,我们如何认识到发生在a上的事情没有发生在'b'上,反之亦然。

共有1个答案

顾喜
2023-03-14

没有一般规则,但是你必须确保你试图关闭你打开的所有资源,即使不认识到在哪个资源中发生了什么。

 void test() throws Exception {
    A a = null;
    B b = null;

    Exception myException = null;
    try {
        a = new A();
        b = new B();
        //useful work here
    } catch (Exception e) {
        myException = e;
        throw e;
    } finally {
        Throwable tA = handleCloaseable(a);
        Throwable tB = handleCloaseable(b);

        boolean throwIt = false;
        if (myException == null && tA != null || tB != null) {
            myException = new Exception();
            throwIt = true;
        }

        if (tA != null) {
            myException.addSuppressed(tA);
        }
        if (tB != null) {
            myException.addSuppressed(tB);
        }

        if (throwIt) {
            throw myException;
        }
    }
}

Throwable handleCloaseable(AutoCloseable e){ // your resources must implements AutoCloseable or Closeable
    if (e != null) {
        try {
            e.close();
        } catch (Throwable t) {
            return t;
        }
    }
    return null;
}

如果在尝试关闭资源时发生任何异常,请创建新的异常(如果不存在),并在尝试使用addsupprested关闭时添加异常

 类似资料:
  • 问题内容: 我试图通过使用常规try-catch-finally语句重新创建新的try-with- resources语句 来了解其工作方式。给定以下使用Java 7 try-with-resources的测试类: 您将如何重写此类以使用try-catch-finally语句,该语句所产生的字节码与try-with- resources语句所产生的字节码完全相同?同样,当使用两个资源时,同样的问题

  • 问题内容: 使用try-with-resources语句关闭资源时,是否可以忽略抛出的异常? 例: 还是应该继续关闭? 问题答案: 我在钱币开发邮件列表中找到了这个答案:http : //mail.openjdk.java.net/pipermail/coin- dev/2009-April/001503.html 5. close方法的某些失败可以安全地忽略(例如,关闭已打开以供读取的文件)。

  • try-with-resources语句是一个try语句,其中包含一个或多个正式声明的资源。 这里资源是一个对象,一旦不再需要就应该关闭它。 try-with-resources语句确保在需求完成后关闭每个资源。 任何实现java.lang.AutoCloseable或java.io.Closeable的对象,接口都可以用作资源。 在Java 9之前,资源将在try之前或try语句内部声明,如下面

  • 本文向大家介绍如何在JDBC中使用try-with-resources?,包括了如何在JDBC中使用try-with-resources?的使用技巧和注意事项,需要的朋友参考一下 每当我们实例化并使用某些对象/资源时,都应显式关闭它们,否则有可能发生资源泄漏。 通常,我们使用finally资源使用close资源作为- 从JSE7开始,引入了try-with-resources语句。在这种情况下,我

  • 是否有像java try catch finally这样的linux bash命令?还是linux shell总是在运行?

  • 主要内容:Java SE 7:Try-With-Resources基础知识,Java SE 7:Try-With-Resources规则,Java SE 9:Try-With-Resources改进在这篇文章中,我们将讨论Java SE 9中的一些改进语句。现在让我们开始学习这个构造。 Java SE 7:Try-With-Resources基础知识 Java SE 7引入了一个新的构造: 语句,用于更好的异常处理。 如果没有这个构造,开发人员必须编写大量冗余和难看的代码。 如果开发人员忘记正确