首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我是否正确地使用了Java 7 try-with-resources

我是否正确地使用了Java 7 try-with-resources
EN

Stack Overflow用户
提问于 2013-07-15 17:32:45
回答 2查看 63.8K关注 0票数 88

如果抛出异常,我期望缓冲的读取器和文件读取器关闭并释放资源。

代码语言:javascript
复制
public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
    try (BufferedReader br = new BufferedReader(new FileReader(filePath)))
    {
        return read(br);
    } 
}

但是,是否需要有catch子句才能成功关闭?

编辑:

从本质上讲,上面的Java 7代码等同于Java 6的下面代码:

代码语言:javascript
复制
public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{

    BufferedReader br = null;

    try
    {
        br = new BufferedReader(new FileReader(filePath));

        return read(br);
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        try
        {
            if (br != null) br.close();
        }
        catch(Exception ex)
        {
        }
    }

    return null;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-15 17:40:04

它是正确的,并且不需要catch子句。Oracle java 7文档表示,无论是否真的抛出异常,资源都将被关闭。

只有当您想要对异常做出反应时,才应该使用catch子句。catch子句将在资源关闭后执行。

这是来自Oracle's tutorial的一个片段

下面的示例从文件中读取第一行。它使用BufferedReader的一个实例从文件中读取数据。BufferedReader是在程序结束后必须关闭的资源:

代码语言:javascript
复制
static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
} // In this example, the resource declared in the try-with-resources statement is a BufferedReader.

...因为BufferedReader实例是在try-with-resource语句中声明的,所以无论try语句是正常完成还是突然完成(由于BufferedReader.readLine方法抛出IOException),它都将被关闭。

编辑

关于新编辑的问题:

Java6中的代码先执行catch,然后执行finally块。这会导致资源仍然可能在catch块中打开。

在Java7语法中,资源在catch块之前关闭,因此资源在catch块执行期间已经关闭。上面的链接记录了这一点:

在try-with-resources语句中,任何catch或finally块都是在声明的资源关闭之后运行的。

票数 105
EN

Stack Overflow用户

发布于 2014-01-25 17:37:02

在这种特殊情况下,您使用try-with-resources的用法可以很好地工作,但在一般情况下并不完全正确。你不应该这样链接资源,因为它可能会导致令人不快的惊喜。假设你有一个可变的缓冲区大小:

代码语言:javascript
复制
public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
    int sz = /* get buffer size somehow */
    try (BufferedReader br = new BufferedReader(new FileReader(filePath), sz))
    {
        return read(br);
    } 
}

假设出了什么问题,最后你的sz结果是负面的。在这种情况下,您的文件资源(通过new FileReader(filePath)创建)将被关闭而不是关闭。

要避免此问题,应分别指定每个资源,如下所示:

代码语言:javascript
复制
public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
    int sz = /* get buffer size somehow */
    try (FileReader file = new FileReader(filePath);
         BufferedReader br = new BufferedReader(file, sz))
    {
        return read(br);
    } 
}

在这种情况下,即使br初始化失败,file仍然会关闭。您可以在herehere上找到更多详细信息。

票数 69
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17650970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档