try-with-resources 中的两种关闭方法

Posted

技术标签:

【中文标题】try-with-resources 中的两种关闭方法【英文标题】:Two close methods in try-with-resources 【发布时间】:2016-11-21 23:04:13 【问题描述】:

我有以下代码:

try(Socket s1=new Socket(...); Socket s2=new Socket(...);)

  some logic...

据我了解,Java 先关闭s2,然后关闭s1。 如果s2.close() 抛出异常会发生什么? Java 会在上次失败后尝试关闭s1 吗?

【问题讨论】:

是的。 try-with-resources 保证 close 将在 s2s1 上被调用(按此顺序)。 这种行为是否记录在某处?因为在这里找不到:docs.oracle.com/javase/tutorial/essential/exceptions/… 【参考方案1】:

引用JLS Sec 14.20.3(强调我的):

资源的关闭顺序与它们初始化时的顺序相反。仅当资源初始化为非空值时才关闭资源。 关闭一个资源的异常不会阻止关闭其他资源。

【讨论】:

以上是关于try-with-resources 中的两种关闭方法的主要内容,如果未能解决你的问题,请参考以下文章

Try-with-resources 关闭生成的孩子的套接字

fortify 抱怨 try-with-resources 块中的资源

java 7新特性-TWR(Try-with-resources)

使用try-with-resource优雅关闭资源

java中的try-with-resources和return语句

如果我们使用 try-with-resource 是不是需要关闭资源