Java中的try-with-resource语句

请看以下功能:

import java.io.*;

public class Try {
    public static void main(String args[]) {
        Try ob = new Try();
        ob.func();
    }

    void func() {
        BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt"));

        try {
            System.out.println(br.readLine());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }

}

在这种情况下,我们利用BufferedReader类的资源。如果方法br.readLine()引发异常(或者即使它没有引发异常),则BufferedReader类的资源将保持打开状态。在Java中,当不再需要所有资源时,关闭它们非常重要。一种实现方法是利用final块,在这里我们关闭了必要的资源。

import java.io.*;

public class Try {
    public static void main(String args[]) {
        Try ob = new Try();
        ob.func();
    }

    void func() {
        BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt"));

        try {
            System.out.println(br.readLine());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            if (br != null) br.close();
        }

    }

}

如果我们在try块中建立了与许多资源的连接,则需要在finally块中逐一关闭所有资源。Java 7和所有更高版本支持的另一种方法是使用try-with-resource块

try-with-resource块的一般语法为:

try (  //在此处打开资源)
{
  //在此处使用资源
}
catch( //在此处捕获异常)
{
//在这里处理异常
}
//资源自动关闭

try-with-resource块中,所有资源都会自动关闭。我们可以捕获并最终将块与try-with-resource块一起使用。关闭资源后,将运行任何catch或finally块。我们可以在try-with-resource语句中打开多个资源,所有这些资源都必须实现Java.lang.AutoCloseable接口。资源以创建时的相反顺序关闭。

考虑对我们的代码进行以下更新:

import java.io.*;

public class Try {
    public static void main(String args[]) {
        Try ob = new Try();
        ob.func();
    }

    void func() {
        try (BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt"))) {
            System.out.println(br.readLine());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

输出结果

C:\example.txt (No such file or directory)

无论try块是正常执行还是突然执行,BufferedReader资源都会自动关闭。

试穿与资源有以下几个优点:

  • 它使代码更易于阅读和解释

  • 资源自动管理

  • 我们不需要做一个finally块,尤其是关闭资源

  • 可以在try-with-resource语句中打开多个资源,以分号分隔

  • 资源以相反的顺序关闭,以避免任何依赖性问题

import java.io.*;

public class Try {
    public static void main(String args[]) {
        Try ob = new Try();
        ob.func();
    }

    void func() {
        try (FileInputStream fin = new FileInputStream("file.txt"); BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt"))) {
            System.out.println(br.readLine());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

输出结果

file.txt (No such file or directory)

注意:这些程序中的输出引发异常,因为它们引用的是该路径中不存在的文件。