为什么在使用 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
将无效。因此,您应该明确指定何时要关闭资源。这就是发明特殊语法的原因。
因为它会改变现有程序的语义。此新功能需要新语法。
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
将无效。因此,您应该明确指定何时要关闭资源。这就是发明特殊语法的原因。
因为它会改变现有程序的语义。此新功能需要新语法。