5

在 Java 7 的新 Try-with-Resources 语法中,我需要担心资源的顺序吗?

try (InputStream in = loadInput(...); // <--- can these be in any order?
     OutputStream out = createOutput(...) ){
    copy(in, out);
}
catch (Exception e) {
    // Problem reading and writing streams.
    // Or problem opening one of them.
    // If compound error closing streams occurs, it will be recorded on this exception 
    // as a "suppressedException".
} 
4

4 回答 4

7

当且仅当使用正常的 try {create resources} finally {close resources} 语法时,顺序才重要。首先获得的资源将最后关闭。有关详细信息,请参阅技术说明。

于 2011-07-13T03:16:17.217 回答
1

在您的示例中,顺序绝对无关紧要。您只使用 try 块中的资源,其中两者都已经可用。如果您要连接到数据库,订单或打开事项,但我会创建一个单独的方法来解决这个问题。该方法需要实现 AutoClosable 并覆盖方法 close()。尽管 close() 会引发异常,但您的方法并非必须如此。

于 2019-02-02T17:45:17.007 回答
0

其实顺序根本不重要。理想情况下,如果资源不相关,您可以按任何顺序打开它们,也可以按任何顺序关闭它们。

如果资源是相关的,您必须按照创建它们的顺序,例如先创建 Connection,然后是 PreparedStatement,我没有任何证据,但我认为 java 会以 FIFO 的顺序关闭资源以避免任何依赖问题。

于 2012-11-05T23:43:51.840 回答
0

如果一个资源的打开依赖于另一个正在打开的资源,这很重要。例如,如果打开 B 需要打开 A,那么您显然希望先打开 A。需要注意的另一件事是资源的关闭顺序与打开的顺序相反。例如,如果您打开 A,然后打开 B,那么当 try-with-resources 关闭它们时,B 先关闭,然后再关闭 A。

于 2012-11-25T15:19:44.227 回答