2011-07-13 39 views
5

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

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". 
} 
+1

如果资源依赖于*彼此*,则(好吧,“可能”取决于他们如何做)。否则......不。 – 2011-07-13 03:10:18

回答

7

当且仅当使用正常try {创建资源} finally {close resources}语法时,重要的顺序至关重要。首先获得的资源将最后关闭。详情请参阅the technotes

0

其实订单并不重要。理想情况下,如果资源不相关,则可以按任意顺序打开它们,并且可以按任何顺序关闭它们。

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

0

如果资源的打开取决于打开的另一个资源,那么这很重要。例如,如果B的开放要求A被打开,那么您显然希望首先打开A.另一件需要注意的是,资源按照与它们打开相反的顺序关闭。例如,如果您打开A然后打开B,则当资源尝试关闭它们时,B先关闭,然后A关闭。