繁体   English   中英

尝试资源

[英]The try-with-resources

我有一个非常简单的问题,对我来说似乎很愚蠢,但是却问。BufferedReader如何调用Autocloseable接口的close()方法。 或我们如何实现可自动调用close()的Autocloseable。

它是语法糖。 Javac编译器在声明BufferedReadertry块的末尾,将close()调用插入到已编译的类中,您可以看到是否使用javap -c反汇编了类文件。

除了实现AutoCloseable并提供close()方法之外,您无需在自己的代码中做任何事情。 Java会在try语句的末尾为您调用close()方法。 考虑以下最小演示:

class MyCloseable implements AutoCloseable {
    public void close() { System.out.println("Close was called"); }
}

public class Ac {
    public static void main(String[] args) {
      try (MyCloseable mc = new MyCloseable()) {
      }
    }
}

$ java Ac
Close was called

try(AutoClosable x = open()) {}
通常被视为的简写形式

try {
    Resource x = open();
} finally {
    x.close();
} 

有两个实际差异:如果两个块就扔了,autoclosable try声明会抛出异常从内try声明,而try...finally将抛出异常从finally块。 来自另一个块的异常将被抑制。

另外,确切的行为是这样的:

try(Autoclosable x = open) {
    //do something
} do_close {
     x.close();//not actually there - executed before catch and finally!
} catch (WhateverException e){
    //catch an exception
} finally {
    //finally do something
}  

Oracle Docs

“ try-with-resources语句可以具有catch和finally块,就像普通的try语句一样。在try-with-resources语句中,任何catch或finally块都在声明的资源关闭后运行。”

因此,由于这两个技术细节,它不仅是语法糖,而且实际上在以前try...finally将要使用的地方使用了它。

除了Autoclosable afaik之外, Autoclosable其他方法可以为其他接口模仿try-with-resources的行为。 如果您想在尝试后进行一些清理,则必须finally使用或实现Autoclosable 终结器似乎做了类似的事情,但实际上却没有。 我只是在这里提到它们, 建议您不要使用它们

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM