如果抛出异常,我期望缓冲的读取器和文件读取器关闭并释放资源。
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的下面代码:
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;
}
发布于 2013-07-15 17:40:04
它是正确的,并且不需要catch
子句。Oracle java 7文档表示,无论是否真的抛出异常,资源都将被关闭。
只有当您想要对异常做出反应时,才应该使用catch
子句。catch
子句将在资源关闭后执行。
这是来自Oracle's tutorial的一个片段
下面的示例从文件中读取第一行。它使用BufferedReader的一个实例从文件中读取数据。BufferedReader是在程序结束后必须关闭的资源:
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块都是在声明的资源关闭之后运行的。
发布于 2014-01-25 17:37:02
在这种特殊情况下,您使用try-with-resources的用法可以很好地工作,但在一般情况下并不完全正确。你不应该这样链接资源,因为它可能会导致令人不快的惊喜。假设你有一个可变的缓冲区大小:
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)
创建)将被关闭而不是关闭。
要避免此问题,应分别指定每个资源,如下所示:
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);
}
}
https://stackoverflow.com/questions/17650970
复制相似问题