2010-03-02 105 views
1

我有方法,所有傳播異常,然後我在一個地方處理,但我意識到一些事情。如何正確關閉資源?

比方說,我有這樣的

public void foo() throws Exception e { 
    Statement stmt = createStatement(); 
    doSomething(stmt); 
    stmt.close(); 
} 

我的問題是,如果異常是由doSometing拋出()方法的聲明不會被關閉的方法,但我不想處理異常那裏。是否有正確的方法試圖捕捉到只會重新拋出異常並最終結束語句?

+0

嘗試,終於.... – Tronic 2010-03-02 11:19:33

回答

6
public void foo() throws Exception e { 

    Statement stmt = null ; 
    try { 
    stmt = createStatement(); 
    doSomething(stmt); 
    } finally { 
    if(stmt != null) 
     stmt.close(); 
    } 
} 
-1

是的,你可以拋出該異常進一步

try { 
    stmt = createStatement(); 
    doSomething(stmt); 
} 
catch (Exception e) { 
    throw e; 
} 
finally { 
    if(stmt != null) 
     stmt.close(); 
} 
+0

不需要把catch塊添加的方法已經聲明拋出異常。你可以嘗試一下沒有捕獲的塊 – Lombo 2010-03-02 11:38:09

+0

爲什麼你會在這裏捕捉並重新拋出?嘗試......終於正常工作,沒有重新拋出。 http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20.2 – 2010-03-02 11:40:37

+0

我錯過了簽名中的提示,我以爲問題是如果它是有效的扔catch塊中還有一個例外。 – HeDinges 2010-03-02 13:19:39

1

修改nos答案。在嘗試阻止之前,您實際上可能會初始化stmt。這樣,就沒有必要看它是否null,所以這只是足夠了:

public void foo() throws Exception e { 

    final Statement stmt = createStatemnt(); 

    try { 
    doSomething(stmt); 
    } finally { 
    stmt.close(); 
    } 
}