是否存在不应在常规 try 块上使用 try-with-resources 的情况?

Posted

技术标签:

【中文标题】是否存在不应在常规 try 块上使用 try-with-resources 的情况?【英文标题】:Are there instances in which try-with-resources shouldn't be used over the regular try block? 【发布时间】:2014-08-22 08:37:15 【问题描述】:

例如,如果需要在不同对象中传递资源实例怎么办?

既然 try-with-resource 的设计(正确地)是为了限制其成员的范围而构建的,那么有人会如何处理这种设计问题?

仍然使用 try-with-resources 并不断地传递实例? 使用常规的 try-catch-finally 块并将成员保持在其范围之外?

【问题讨论】:

这听起来有点抽象。您能否添加一些示例代码来概述不同选项的含义? 【参考方案1】:

来自文档: " 资源是程序结束后必须关闭的对象。try-with-resources 语句确保每个资源在语句结束时关闭。任何实现@的对象987654321@,包括所有实现java.io.Closeable的对象,都可以作为资源使用。”

如果您想要一个始终需要资源的设计,请不要选择try-with-resources,而是将资源保留在外部并在简单的try-catch 内部使用它。 但是如果你使用这个策略,请确保你做了必要的CLEANUP

此外,如果您使用传统的 try-catch,您可能需要更频繁地编写嵌套的 try-catch 块。(关闭资源也会引发 Exception

【讨论】:

【参考方案2】:

正如雷所说,这个问题有点抽象。我想到了两种情况:

对资源的本地引用:使用 try-with-resources 当然,您可以将资源传递给 try 块内的其他方法。 引用资源的成员变量:考虑实现 AutoCloseable,以便您的类本身的实例可以在 try-with-resources 块中使用。

【讨论】:

【参考方案3】:

不应该总是使用资源尝试,并且必须在创建可关闭对象时使用。即使你有一个传入的对象,这意味着调用者必须有一个 try-catch 块,它在其中调用你的方法。然后外部调用者的 try-catch 将关闭该对象。

【讨论】:

以上是关于是否存在不应在常规 try 块上使用 try-with-resources 的情况?的主要内容,如果未能解决你的问题,请参考以下文章

ID不应在指定日期之间显示?

GraphQL SPQR:id 不应在创建时显示

使用 Enzyme 测试 React 组件时出错:'不变违规:您不应在 <Router> 外使用 <Link>'

不应在其焦点上显示软键盘的 Xamarin.Forms 条目

如何在不使用try语句的情况下查看文件是否存在

视频不应在 NodeJs 中下载