try-with-resources 语句

2024 年 8 月 29 日 | 阅读 3 分钟

在 Java 中,try-with-resources 语句是一个 try 语句,它声明一个或多个资源。资源是一个对象,必须在程序结束时关闭。 try-with-resources 语句确保在语句执行结束时关闭每个资源。

您可以传递任何实现 java.lang.AutoCloseable 的对象,其中包括所有实现 java.io.Closeable 的对象。

以下示例将一个字符串写入文件。它使用 FileOutputStream 的一个实例将数据写入文件。 FileOutputStream 是一个资源,必须在程序完成使用后关闭。 因此,在此示例中,资源的关闭由 try 本身完成。


Try-with-resources 示例 1

输出

Message written to file successfuly!

文件的输出

Welcome to javaTpoint!

Try-with-resources 示例:使用多个资源

输出

------------Data written into file--------------
Welcome to javaTpoint!
------------Data read from file--------------
Welcome to javaTpoint!

您可以使用 catch 和 finally 块与 try-with-resources 语句,就像普通的 try 语句一样。

注意 - 在 try-with-resources 语句中,catch 或 finally 块在声明的资源关闭后执行。


Try-with-resources 示例:使用 finally 块

输出

Data written successfully!
Finally executes after closing of declared resources.

被抑制的异常

如果 try 块抛出异常,并且 try-with-resources 抛出一个或多个异常,则 try-with-resources 抛出的异常将被抑制。 换句话说,我们可以说,try-with-resources 抛出的异常是被抑制的异常。

您可以使用 Throwable 类的 getSuppress() 方法获取这些异常。

Java 在 Throwable 类中添加了一个新的构造函数和两个新的方法来处理被抑制的异常。

构造函数描述
protected Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)它使用指定的详细消息、原因、启用或禁用抑制以及启用或禁用可写入堆栈跟踪来构造一个新的 throwable。

方法描述
public final void addSuppressed(Throwable exception)/td>它将指定的异常附加到为了传递此异常而被抑制的异常。 这种方法是线程安全的,通常由 try-with-resources 语句(自动且隐式地)调用。 它抛出以下异常:IllegalArgumentException: 如果异常是 throwable,则 throwable 无法抑制自身。 NullPointerException: 如果异常为 null。
public final Throwable[] getSuppressed()它返回一个包含 try-with-resources 语句抑制的所有异常的数组。 如果没有抑制异常或禁用抑制,则返回一个空数组。