原文地址:https://www.cnblogs.com/xhj123/p/12578419.html

    try-with-resources 是 jdk1.7 加入的机制,可以保证资源使用后正常关闭,并使代码更加简洁。

    try-catch-finally 使用实例:

    1. public void handle(String fileName) {
    2. BufferedReader reader = null;
    3. try {
    4. String line;
    5. reader = new BufferedReader(new FileReader(fileName));
    6. while ((line = reader.readLine()) != null) {
    7. ...
    8. }
    9. } catch (Exception e) {
    10. ...
    11. } finally {
    12. if (reader != null) {
    13. try {
    14. reader.close();
    15. } catch (IOException e) {
    16. ...
    17. }
    18. }
    19. }
    20. }

    可以看到为了保证 resources 正常关闭,finally 中又使用 if 语句以及 try-catch,增加了代码的复杂性。

    try-with-resources 使用实例:

    1. public void handle(String fileName) {
    2. try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
    3. String line;
    4. while ((line = reader.readLine()) != null) {
    5. ...
    6. }
    7. } catch (Exception e) {
    8. ...
    9. }
    10. }

    可以看到,try-with-resources 的比前一种方法明显节省了很多代码,资源在 try 后边的 () 中生成,在 try 结束后程序会自动关闭资源。

    如果需要声明多个资源,可以在 try 后面的 () 中,以; 分隔;也就是说,try 后边的 () 可以添加多行语句。

    1. try (BufferedReader reader1 = new BufferedReader(new FileReader(fileName1));
    2.   BufferedReader reader2 = new BufferedReader(new FileReader(fileName2));) {
    3.   ...
    4. } catch (Exception e) {
    5.   ...
    6. }

    需要注意的是,try 后边括号中声明的资源必须实现 java.lang.AutoCloseable, 如果声明没实现这个接口的变量,IDE 会进行提示’The resource type File does not implement java.lang.AutoCloseable’。

    比如我在里面声明了一个 File 类型的变量:

    使用try-with-resources代替try-catch-finally - 图1

    参考:

    1. 教你消灭 Java 代码的 “坏味道” : https://mp.weixin.qq.com/s/rGXb_weYLVu0xQ2NmarBlQ

    2. Java – Try with Resources : https://www.baeldung.com/java-try-with-resources