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

Why declare Resource in try() while using try-with-resources

try-with-resources 语句 以下是 Java Docs

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

根据文档,

The try-with-resources statement ensures that each resource is closed at the end of the statement.

我的问题是, 为什么我需要在 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)

我只是想,为什么要更改语法。

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

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

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

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

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