java - 在尝试使用之前创建的资源语句中使用资源

标签 java try-with-resources

从 Java 7 开始,我们可以对资源使用 try:

try (One one = new One(); Two two = new Two()) {
    System.out.println("try");
} catch (Exception ex) { ... }

现在我的问题是,为什么我必须在 try 语句中创建对象?为什么我不允许在这样的语句之前创建对象:

One one = new One();
try (one; Two two = new Two()) {
    System.out.println("try");
} catch (Exception ex) { ... }

我看不出有什么理由认为这是个问题。尽管我收到错误消息“此语言级别不支持资源引用”。我将我的 IDE (IntelliJ IDEA) 设置为 Java 8,这样应该可以。不允许这样做有充分的理由吗?

最佳答案

您不必在 try-with-resources 语句中创建对象,您只需声明一些实现 AutoCloseable 类型的局部变量。这些变量实际上是最终的,并且限定在 try block 中,这允许编译器使用它们来生成清理所需的 close 样板文件。

FileInputStream f1 = new FileInputStream("test1.xml");
FileInputStream f2 = new FileInputStream("test2.xml");
// Don't need to create the resources here, just need to declare some vars
try (InputStream in1 = f1; InputStream in2 = f2) {
    // error; in1 is final
    in1 = new FileInputStream("t");
}

Better Resource Management with Java SE 7: Beyond Syntactic Sugar .

附录:从 java 9 开始,要求放宽了;如果原始变量实际上是最终的,则不必在 try block 中重新声明变量。

JEP 213

关于java - 在尝试使用之前创建的资源语句中使用资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41206524/

相关文章:

java - Jaxb 使用 "get"而不是 "is"前缀创建 boolean 方法访问器名称

java - JVM堆不断增加。为什么?

Java:我们是否应该尽快退出 try-with-resource block 以释放资源?

java - 带有 gae 的 kaazing websocket

java - Apache POI - 将 *.doc 转换为带图像的 *.html

java - SurfaceView -> Surface 没有有效的 native 窗口 | Android 相机 API |硬件.camera2

java - 将 JQuery UI 集成到 Play 框架中

java - 资源是在 finally 之前还是之后关闭?

java - 如果我们使用 try-with-resource 是否需要关闭资源

java - 如何使用锁包装器进行自动关闭?