条目9:与try-finally 相比,首选 try -with -resource
什么是 try-finally?
try-finally
是 Java 中传统的资源管理方式,通常用于确保资源(如文件流、数据库连接等)被正确关闭。
java">BufferedReader reader = null;
try {reader = new BufferedReader(new FileReader("test.txt"));String line = reader.readLine();System.out.println(line);
} catch (IOException e) {e.printStackTrace();
} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}
}
缺点:
- 代码繁琐:需要在
finally
中显式关闭资源。 - 容易出错:如果忘记在
finally
中关闭资源,可能导致资源泄漏。 - 嵌套复杂:当多个资源需要管理时,代码变得更加难以阅读和维护。
- 异常掩盖问题:如果关闭资源时发生异常,会覆盖原始异常,导致问题难以排查。
什么是 try-with-resources?
try-with-resources
是 Java 7 引入的语法糖,旨在简化资源管理。其核心思想是:自动关闭实现了 AutoCloseable
接口的资源。
java">try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {String line = reader.readLine();System.out.println(line);
} catch (IOException e) {e.printStackTrace();
}
工作原理
-
只需在
try
声明中定义资源。 -
在
try
块结束后,Java 会自动调用资源的close()
方法。 -
如果多个资源需要管理,可以在
try
声明中用分号分隔声明。
java">try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"));FileWriter writer = new FileWriter("output.txt")
) {writer.write(reader.readLine());
} catch (IOException e) {e.printStackTrace();
}
优点:
- 代码更简洁,减少了显示关闭资源的代码,使代码更加直观,更易读
- 自动资源管理,只要实现了
AutoCloseable
接口的类(包括Closeable
的子类)都支持自动关闭。 - 更安全,避免资源泄漏:即使
try
块中发生异常,资源也能被正确关闭。避免异常掩盖:如果关闭资源时发生异常,Java 会将其与主异常一并记录,而不会直接覆盖主异常。 - 多资源管理时,
try-with-resources
的嵌套深度远低于try-finally