2014-04-08 42 views
18

我想知道是否將返回語句在內嘗試使用資源塊會阻止資源被自動關閉。在java中嘗試使用資源和返回語句

try(Connection conn = ...) { 
    return conn.createStatement().execute("..."); 
} 

如果我寫這樣的事情將連接被關閉?在Oracle文檔中聲明:

try-with-resources語句確保在語句結束時關閉每個資源。

如果由於返回語句而永遠不能達到語句的結尾,會發生什麼?

+0

如果方法堆棧彈出,則語句結束。當拋出異常時,你會怎麼想? –

+1

'return'流過'finally'子句的主體,這是釋放資源的地方。 –

回答

28

根據Oracle's tutorial,「[資源]將被關閉,無論try語句是正常還是突然完成」。它從例外中定義了abruptly

try內返回的是突變完成的示例,如JLS 14.1所定義。

+1

這在技術上並非如此。 return語句沒有正常完成,因此'try'塊沒有正常完成。它突然完成。 –

+0

@SotiriosDelimanolis,我一直認爲這很正常,但我找不到任何文件。你能找到這方面的任何文件嗎? – merlin2011

+1

我在我的手機上:(如果你在包含try catch塊的章節中去了JLS,那麼還有一個部分定義了通常完成的意思。查找返回語句中的條目。 –

5

該資源將自動關閉(即使使用return語句),因爲它實現AutoCloseable接口。以下是輸出「成功關閉」的示例:

public class Main { 

    public static void main(String[] args) { 
     try (Foobar foobar = new Foobar()) { 
      return; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class Foobar implements AutoCloseable { 

    @Override 
    public void close() throws Exception { 
     System.out.println("closed successfully"); 
    } 
}