为什么在使用try-with-resources时在try()中声明Resource

时间:2015-09-01 11:45:57

标签: java exception exception-handling java-7 try-with-resources

try-with-resources Statement 以下是来自Java Docs

的示例
static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

根据文件,

  

try-with-resources语句确保在语句结束时关闭每个资源。

我的问题是, 为什么我需要在try关键字后立即在括号内声明资源。 (如上面的BuffereReader)

BuffereReader实现java.lang.AutoCloseable

那么为什么不支持这样的事情,

static String readFirstLineFromFile(String path) throws IOException {
        try{
            BufferedReader br =
                       new BufferedReader(new FileReader(path))
            return br.readLine();
        }
    }

只是在尝试之后隐式关闭资源对象。 (因为它实现了AutoCloseable)

我只是想了一下,为什么要改变语法。

请正确阅读问题,仅关于语法。

2 个答案:

答案 0 :(得分:6)

在某些情况下,您不希望立即关闭AutoCloseable资源。例如:

static BufferedReader getBufferedReader(String path) {
    try{
        FileReader fr = new FileReader(path);
        return new BufferedReader(fr);
    }
    catch(IOException ex) {
        // handle somehow
    }
}

在这种情况下,您无法在fr块退出时关闭try。否则返回的BufferedReader将无效。因此,您应该明确指定何时关闭资源。这就是发明特殊语法的原因。

答案 1 :(得分:3)

因为它会改变现有程序的语义。这个新功能需要一种新的语法。