java - Java 中的 try-with-resources 语句

标签 java try-with-resources

在这个 Java 程序示例中:

package test;

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;

public class Test
{
    private static void example(){
        String url = "jdbc:oracle:thin:@//localhost:7856/xe";
        String user = "user";
        String password = "pass";
        try(Connection con = DriverManager.getConnection(url, user, password);
            Statement stmt = con.createStatement()){
            throw new OutOfMemoryError("Error");
        }catch (SQLException e){
            System.err.println("SQLException");
        }
    }

    public static void main(String [] args){
        try{
            example();
        }catch (OutOfMemoryError e){
            System.err.println("OutOfMemoryError");
        }
        // Rest of code here...
    }
}

当在静态方法 example() 的主体中抛出 OutOfMemoryError 错误时,连接“con”和语句“stmt”是否在终止静态方法 example() 之前自动关闭,尽管没有任何“catch”捕获这些错误,所以在 main() 的其余代码中确定这两个对象已关闭?

谢谢。

最佳答案

是的; try-with-resources 构造总是关闭资源,即使它是一个未经检查的可抛出对象(如 OutOfMemoryError)。

这在 JLS 14.20.3 中指定,它以一个非常通用的声明开始,即资源“自动关闭”,然后进入资源关闭时间的各种示例。基本上,任何非 null 资源都是总是关闭的,就好像关闭是在 try-finally 的 finally 子句中一样 专为该资源创建。即使 try 中有多个资源也是如此,就像您的情况一样(“关闭一个资源的异常不会阻止关闭其他资源”)。

演示它的简单类:

public class Twr {
  private static class TwrCloseable implements AutoCloseable {
    private final String id;

    TwrCloseable(String id) {
      this.id = id;
    }

    @Override
    public void close() {
      System.out.println("closing " + id);
    }
  }

  public static void main(String[] args) {
    try (TwrCloseable closeable1 = new TwrCloseable("first");
         TwrCloseable closeable2 = new TwrCloseable("second")) {
      throw new OutOfMemoryError();
    }
  }
}

输出:

closing second
closing first
Exception in thread "main" java.lang.OutOfMemoryError
    at Twr.main(Twr.java:19)

请注意,它们以相反的顺序关闭; “second”在“first”之前关闭。在您的示例中,这意味着 StatementConnection 之前关闭,这正是您想要的。

关于java - Java 中的 try-with-resources 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23702000/

相关文章:

java - Android 通过UDP套接字发送对象

java - 是否可以根据在 java 中调用方法的位置在方法中执行不同的代码?

java - try-with-resource 关闭序列 : FileInputStream close executed three times

java尝试使用资源: empty result set

java - 按手机上的后退按钮有不同的行为来返回 Intent

java - 使用@FindBy时如何实现 'wait'函数?

java - try-with-resources 语句的目的是什么?

java - 如何使用 try 和资源将 while 循环放入线程中?

java - 如何使用 Java7 try-with-resources 特性将资源作为参数传递

java 两个旋转矩形之间的碰撞检测